快而简略:
SELECT group_name, color, count(*) AS ct
FROM (
SELECT group_name, unnest(favorite_colors) AS color
FROM tbl
) sub
GROUP BY 1,2
ORDER BY 1,3 DESC;
在Postgres9.3或更高版本中,这是更清晰的形式:
SELECT group_name, color, count(*) AS ct
FROM tbl t, unnest(t.favorite_colors) AS color
GROUP BY 1,2
ORDER BY 1,3 DESC;
以上是的缩写。
...
FROM tbl t
JOIN LATERAL unnest(t.favorite_colors) AS color ON TRUE
...
与任何其他INNER JOIN
一样,它会排除没有颜色的行(favorite_colors IS NULL
)- 就像第一个查询一样。
如果要在结果中包括这些行,则使用以下方法:
SELECT group_name, color, count(*) AS ct
FROM tbl t
LEFT JOIN LATERAL unnest(t.favorite_colors) AS color ON TRUE
GROUP BY 1,2
ORDER BY 1,3 DESC;
在下一步中,您可以轻松地按组聚合“最常见”的颜色,但是您需要首先定义“最常见的颜色”...
最常见的颜色
根据评论,选择出现次数> 3的颜色。
SELECT t.group_name, color, count(*) AS ct
FROM tbl t, unnest(t.favorite_colors) AS color
GROUP BY 1,2
HAVING count(*) > 3
ORDER BY 1,3 DESC;
为了聚合数组中的前几种颜色(按降序排列):
SELECT group_name, array_agg(color) AS top_colors
FROM (
SELECT group_name, color
FROM tbl t, unnest(t.favorite_colors) AS color
GROUP BY 1,2
HAVING count(*) > 3
ORDER BY 1, count(*) DESC
) sub
GROUP BY 1;
-> SQLfiddle demonstrating all.
HAVING
条件来查询仅具有超过 3 次出现次数的颜色,我应该在哪里放置HAVING
语句。我一直收到语法错误。 - mhkeller