在 postgres 上我有这样的数据:
id | device_model | device_type
1 | "samsung" | 1
2 | "iphone 4" | 1
3 | "samsung" | 1
4 | "ipad" | 0
5 | "ipad" | 0
我希望获得每个 device_type 的前 5 个 device_model。
目前我正在做:
SELECT device_model, COUNT(*)
FROM devices
GROUP BY device_model
ORDER BY COUNT(*) DESC
limit 5;
但它不会为每个 device_type 呈现 top5。我可以用什么来做到这一点?看来我需要做一个 UNION。
我可以做类似的事情吗:
SELECT device_model, COUNT(*)
FROM devices
WHERE device_type = 1
GROUP BY device_model
ORDER BY COUNT(*) DESC
LIMIT 5
UNION
SELECT device_model, COUNT(*)
FROM devices
WHERE device_type = 0
GROUP BY device_model
ORDER BY COUNT(*) DESC
LIMIT 5;
ERROR: syntax error at or near "UNION"
LINE 7: UNION ALL
^
Query failed
PostgreSQL said: syntax error at or near "UNION"
这是正确的查询:
它处理具有相同排名的模型,以防万一,每种设备类型显示超过 5 行。
为了测试它,创建一个表并用数据填充它:
初始查询的输出如下:
随时询问有关此解决方案背后的逻辑的问题。
目前我正在做:
它正在工作,但也许可以重构或更改。