我有一个这样的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的第一行。主要目标是将用户列表放在一起,它是USER_TOTAL_PERMISSION_PER_BRANCH上的分支和TOP1或distinct
以下是示例输出:

预期输出应为:
[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发布于 2019-11-02 02:06:10
您可以使用窗口函数:
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发布于 2019-11-02 02:09:23
您可以使用相关性将您的查询转换为CTE a do过滤:
with cte as (
    select 
        count(permission_id) as user_total_permission_per_branch,
        user_id,
        branch_id
    from branch_permission_user
    group by user_id, branch_id
)
select c.* 
from cte c
where c.user_total_permission_per_branch = (
    select max(c1.user_total_permission_per_branch)
    from cte c1 
    where c1.user_id = c.user_id and c1.branch_id = c.branch_id
)发布于 2019-11-02 02:10:54
感谢@戈登爵士
我使用他的逻辑。这就是它:
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 = 1https://stackoverflow.com/questions/58663842
复制相似问题