【问题标题】:select distinct from a union table with one column as preference从具有一列作为首选项的联合表中选择不同的
【发布时间】:2019-12-10 20:46:15
【问题描述】:

我有两个表的联合结果,如下所示:

UserId  AppId   Status
------------------------
A1      5       INACTIVE
A1      5       SUSPENDED
A1      6       REVOKED
A1      6       SUSPENDED
A1      6       ACTIVE
A1      7       REVOKED
A1      8       SUSPENDED
B2      7       INACTIVE
B2      7       INACTIVE
B2      7       ACTIVE
C3      6       INACTIVE

如何消除具有重复 UserId 和 AppId 的行并仅返回一个状态,并按优先顺序返回: 1. 活跃 2. 暂停 3. 撤销 4. 不活跃

UserId  AppId   Status
------------------------
A1      5       SUSPENDED
A1      6       ACTIVE
A1      7       REVOKED
A1      8       SUSPENDED
B2      7       ACTIVE
C3      6       INACTIVE

【问题讨论】:

    标签: sql greatest-n-per-group


    【解决方案1】:

    为状态优先级创建一个表格,其中包含一个状态列,以及一个介于 1 和 4 之间的数字,就像您在首选项中列出的那样。 将该表加入您的集合,并使用具有 GROUP BY UserId 和 AppId 的 MAX 聚合函数来查找每个用户存在的最高优先级,然后将其用作过滤器。

    您没有指定您使用的数据库引擎,也没有提供 DDL 和示例数据,因此我们无法为您提供可行的解决方案,只能为您提供高层次的指导,让您朝着正确的方向前进。

    HTH

    【讨论】:

      【解决方案2】:

      这个常见的问题被称为“按组选择顶行”。查询看起来像这样:

      WITH comp AS (
          SELECT t.UserId, 
              t.AppId, 
              t.Status, 
              ROW_NUMBER() OVER(PARTITION BY t.UserId, t.AppId 
                  ORDER BY CASE 
                      WHEN t.Status = 'ACTIVE' THEN 1
                      WHEN t.Status = 'SUSPENDED' THEN 2
                      ...
                  END CASE ASC) AS rank
            FROM ??? AS t)
      SELECT *
        FROM comp
       WHERE rank = 1
      

      有关此主题的更多信息:Select first row in each GROUP BY group?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多