【问题标题】:How to get rid of multiple branch_id?如何摆脱多个branch_id?
【发布时间】:2019-11-02 02:15:13
【问题描述】:

我有一个这样的 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

【问题讨论】:

    标签: sql sql-server optimization


    【解决方案1】:

    你可以使用窗口函数:

    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
    

    【讨论】:

      【解决方案2】:

      您可以将查询转换为 CTE,并使用相关性进行过滤:

      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
      )
      

      【讨论】:

      • 运行此查询后出现错误。这是错误消息:Msg 4104, Level 16, State 1, Line 14 The multi-part identifier "cte1.user_id" could not be bound. Msg 4104, Level 16, State 1, Line 14 The multi-part identifier "cte1.branch_id" could not be bound.
      • @Star:这是一个错字,刚刚改正。
      • 嗨@GMB。我运行了 sql 查询,但我再次获得了具有不同分支的多个 user_id。我只想要一个 user_id,也许是第一行以摆脱多个 user_id
      【解决方案3】:

      感谢@Gordon 爵士

      我使用他的逻辑。就是这样:

      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
      

      【讨论】:

      • 这不是一个真正的答案。戈登已经将此作为答案发布。您应该删除此答案并将其标记为已接受的答案。
      • 对不起。我是stackoverflow的新手。谢谢(你的)信息。 ^_^ 我是对的,我应该点击他评论上的复选符号吗?然后单击向上箭头?谢谢@Sean先生
      猜你喜欢
      • 2021-07-07
      • 2020-02-21
      • 2012-04-15
      • 2011-08-21
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 2014-01-28
      相关资源
      最近更新 更多