首页 > 解决方案 > 如何编写单个 SQL 查询以挑出具有多个条件的子组

问题描述

我有这张桌子: 在此处输入图像描述

我需要得到这张桌子: 在此处输入图像描述

一个类应该对应一个id。班级选择如下:

  1. 选择最常见的 id 类(例如,id 333 对应于 A 类)。

  2. 但如果一个 id 对应于类“其他”和其他类,则该 id 被分配一个多数派类,而“其他”类不被考虑。在这种情况下,如果班级数相同,则分配最后一天的班级。例如,id 111 对应于 3 个类('other', A, B)。A类和B类的数量是两个。ID 111 被分配到 A 类,因为它是在最后一个日期。

  3. 如果该类仅分配了“others”类,则 id 对应于“others”类(例如,222 类被分配了“others”类,因为它仅分配了“others”类)。

标签: sql

解决方案


当您想从子集中选择任何一行时,您应该RANK按条件对子集中的行进行排序,然后按排名过滤行。

您可以尝试使用此查询来解决您的问题。

select id, class 
from (
        Select 
            Id
            , Class
            , RANK() OVER (PARTITION BY Id 
                            ORDER BY 
                                case when class='other' then 0 else 1 end desc -- condition # 3
                                , count(*) desc -- condition # 1
                                , max(date1) desc ) AS RowRank -- condition # 2
        from @table1 
        group by id, class
    ) Q
where rowrank = 1

推荐阅读