【发布时间】:2021-09-11 19:12:39
【问题描述】:
我有这张桌子ratings:
| id | user_id | type | value |
|---|---|---|---|
| 0 | 0 | Rest | 4 |
| 1 | 0 | Bar | 3 |
| 2 | 0 | Cine | 2 |
| 3 | 0 | Cafe | 1 |
| 4 | 1 | Rest | 4 |
| 5 | 1 | Bar | 3 |
| 6 | 1 | Cine | 2 |
| 7 | 1 | Cafe | 5 |
| 8 | 2 | Rest | 4 |
| 9 | 2 | Bar | 3 |
| 10 | 3 | Cine | 2 |
| 11 | 3 | Cafe | 5 |
我希望有一个表格,每对 (user_id, type) 对应所有用户中排名前 3 的类型(在整个表格中按 sum(value) 排名)。
想要的结果:
| user_id | type | value |
|---|---|---|
| 0 | Rest | 4 |
| 0 | Cafe | 1 |
| 0 | Bar | 3 |
| 1 | Rest | 4 |
| 1 | Cafe | 5 |
| 1 | Bar | 3 |
| 2 | Rest | 4 |
| 3 | Cafe | 5 |
| 2 | Bar | 3 |
我可以通过两个查询来做到这一点,一个是获取前 3 个,另一个是获取类型与前 3 个类型匹配的行。
有人知道如何将其放入单个查询中吗?
【问题讨论】:
-
我不太明白输出。为什么用户 3 只有一行,为什么用户 0 有 Cafe 而不是 Cine?
-
因为我想要的前 3 名不在组内,而是在所有收视率内。前 3 种类型是:Rest -> 12 Cafe -> 11 Bar -> 9 因此过滤行以仅显示对前 3 种类型进行评分的行
标签: sql postgresql aggregate greatest-n-per-group