我有张桌子:
表-用户
user_id name country role function
1 abc1 US Developer IT
2 abc3 US Developer IT
3 abc4 US Developer IT
4 abc6 US Developer IT
5 abc8 US Developer IT
6 abc9 US Developer IT
7 abc5 Canada Developer IT
8 abc2 Canada Accountant Finance
9 abc7 US Accountant Finance
10 abc10 Canada Developer IT
11 abc11 Canada Accountant Finance
12 abc12 US Accountant Finance如何对上表进行排序,以获得country、role和function独特组合的记录。
因此,输出将类似于:
user_id name country role function
1 abc1 US Developer IT
7 abc5 Canada Developer IT
9 abc7 US Accountant Finance
8 abc2 Canada Accountant Finance
2 abc3 US Developer IT
10 abc10 Canada Developer IT
12 abc12 US Accountant Finance
11 abc11 Canada Accountant Finance
3 abc4 US Developer IT
4 abc6 US Developer IT
5 abc8 US Developer IT
6 abc9 US Developer IT上面的结果使用以下逻辑:
country、role和function的不同组合现在,唯一的不同组合并不存在,所以下一个记录将来自于第一个不同的组合。
在PostgresSQL中有实现这一目标的方法吗?
发布于 2020-04-22 13:25:24
使用ROW_NUMBER()窗口函数:
SELECT t.user_id, t.name, t.country, t.role, t.function
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY country, role, function ORDER BY user_id) as rn
FROM "user"
) t
ORDER BY rn, user_id见演示。
结果:
| user_id | name | country | role | function |
| ------- | ----- | ------- | ---------- | -------- |
| 1 | abc1 | US | Developer | IT |
| 7 | abc5 | Canada | Developer | IT |
| 8 | abc2 | Canada | Accountant | Finance |
| 9 | abc7 | US | Accountant | Finance |
| 2 | abc3 | US | Developer | IT |
| 10 | abc10 | Canada | Developer | IT |
| 11 | abc11 | Canada | Accountant | Finance |
| 12 | abc12 | US | Accountant | Finance |
| 3 | abc4 | US | Developer | IT |
| 4 | abc6 | US | Developer | IT |
| 5 | abc8 | US | Developer | IT |
| 6 | abc9 | US | Developer | IT |在您的预期结果中,带有user_id的8、9和11、12的行顺序相反,但您没有解释原因。
发布于 2020-04-22 11:57:50
试试这个:
WITH data AS (
SELECT row_number() OVER (PARTITION BY country, role, function) as rownum, *
FROM user
)
SELECT *
FROM data
ORDER BY rownumrownum user_id name country role function
1 11 abc11 Canada Accountant Finance
1 7 abc5 Canada Developer IT
1 12 abc12 US Accountant Finance
1 5 abc8 US Developer IT
2 8 abc2 Canada Accountant Finance
2 9 abc7 US Accountant Finance
2 10 abc10 Canada Developer IT
2 4 abc6 US Developer IT
3 1 abc1 US Developer IT
4 3 abc4 US Developer IT
5 2 abc3 US Developer IT
6 6 abc9 US Developer IThttps://stackoverflow.com/questions/61363388
复制相似问题