首页 > 解决方案 > 如何摆脱多个branch_id?

问题描述

我有一个这样的 SQL 查询:

SELECT 
    COUNT(PERMISSION_ID) AS USER_TOTAL_PERMISSION_PER_BRANCH,
    USER_ID,
    BRANCH_ID
FROM BRANCH_PERMISSION_USER
GROUP BY USER_ID, BRANCH_ID
ORDER BY USER_ID, USER_TOTAL_PERMISSION_PER_BRANCH DESC

但我有一个问题,因为我只想要每个 user_id 的第一行。主要目标是将用户列表放在一起,它的分支和前 1 或 USER_TOTAL_PERMISSION_PER_BRANCH 上的不同

这是示例输出:

点击这里

预期输出应该是:

[USER_TOTAL_PERMISSION_PER_BRANCH][USER_ID][BRANCH_ID]

135    1    1
135    2    1
134    3    1
1      4    1
1      5    1
1      6    1

标签: sqlsql-serveroptimization

解决方案


您可以使用窗口函数:

SELECT USER_TOTAL_PERMISSION_PER_BRANCH, USER_ID, BRANCH_ID
FROM (SELECT COUNT(*) AS USER_TOTAL_PERMISSION_PER_BRANCH,
             USER_ID, BRANCH_ID,
             ROW_NUMBER() OVER (PARTITION BY USER_ID ORDER BY COUNT(*) DESC) as seqnum
      FROM BRANCH_PERMISSION_USER
      GROUP BY USER_ID, BRANCH_ID
     ) ub
WHERE seqnum = 1

推荐阅读