Tengo una tabla como la siguiente:Obtener valor más común para cada valor de otra columna en SQL
Column | Type | Modifiers
---------+------+-----------
country | text |
food_id | int |
eaten | date |
Y para cada país, que desea obtener el alimento que se come con más frecuencia. Lo mejor que puedo pensar (estoy usando postgres) es:
CREATE TEMP TABLE counts AS
SELECT country, food_id, count(*) as count FROM munch GROUP BY country, food_id;
CREATE TEMP TABLE max_counts AS
SELECT country, max(count) as max_count FROM counts GROUP BY country;
SELECT country, max(food_id) FROM counts
WHERE (country, count) IN (SELECT * from max_counts) GROUP BY country;
En esta última afirmación, la GROUP BY y max() son necesarios para romper los lazos, en los que dos alimentos diferentes tienen el mismo número.
Esto parece mucho trabajo para algo conceptualmente simple. ¿Hay una forma más directa de hacerlo?
Estaría interesado en ver el plan de ejecución para este vs. la tabla temporal - los "que tienen" cláusulas se evalúan _after_ SELECT recupera las filas coincidentes , ¿derecho? Parece que puede haber un bote de IO extra. –
Hay un par de escaneos de tablas completos en el plan, sí. – JosephStyons