首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合方式的PostgresSQL排序

混合方式的PostgresSQL排序
EN

Stack Overflow用户
提问于 2020-04-22 10:56:15
回答 2查看 39关注 0票数 0

我有张桌子:

表-用户

代码语言:javascript
复制
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

如何对上表进行排序,以获得countryrolefunction独特组合的记录。

因此,输出将类似于:

代码语言:javascript
复制
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

上面的结果使用以下逻辑:

  • 寻找countryrolefunction的不同组合
  • 以第一次不同组合的第一次记录为例。为了前夫。第1行有country = US,role = Developer,function = IT
  • 以第一个记录的第二个不同的组合。为了前夫。第2行拥有国家=加拿大,角色=开发人员,函数= IT
  • 以第三种不同组合的第一种记录为例。为了前夫。第三行有国家=美国,角色=会计,职能=财务
  • 以第四种不同组合的第一种记录为例。为了前夫。第4行有国家=加拿大,角色=会计,职能=财务

现在,唯一的不同组合并不存在,所以下一个记录将来自于第一个不同的组合。

在PostgresSQL中有实现这一目标的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-22 13:25:24

使用ROW_NUMBER()窗口函数:

代码语言:javascript
复制
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

演示

结果:

代码语言:javascript
复制
| 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的行顺序相反,但您没有解释原因。

票数 1
EN

Stack Overflow用户

发布于 2020-04-22 11:57:50

试试这个:

代码语言:javascript
复制
WITH data AS (
  SELECT row_number() OVER (PARTITION BY country, role, function) as rownum, *
  FROM user
)
SELECT *
FROM data
ORDER BY rownum
代码语言:javascript
复制
rownum  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  IT
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61363388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档