如何编写单个SQL查询来挑出具有多个条件的子组

问题描述 投票:0回答:2

我有这张桌子:enter image description here

我需要得到这张桌子:enter image description here

一个类应该对应一个id。该课程选择如下:

  1. 选择最常见的id类(例如,id 333对应于A类)。
  2. 但是如果一个id对应于“其他”类和其他类,那么id被分配一个多数类,而类'other'则不被考虑。在这种情况下,如果类的数量相同,则分配最后一个日期的类。例如,id 111对应于3个类('其他',A,B)。 A类和B类的数量是两个。 Id 111被分配了A类,因为它是在最后一个日期。
  3. 如果类只被赋予类'other',那么id对应于'others'类(例如,类222被赋予类'others',因为它只被赋予类'others')。
sql
2个回答
1
投票

如果要从子集中选择任何一行,则应按条件对每行进行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

0
投票

如果您的DBMS能够使用row_number(),您可以先按idclass分组以获得计数和最大date1。从该结果中选择构建由id分区的行号。作为行号的顺序使用CASE在任何其他类之后对other进行排序,然后,降序,计数和最大date1 - 如果计数相等,则最大date1将决定。仅选择行号等于1的行,即顺序中的第一行。

SELECT id,
       class
       FROM (SELECT id,
                    class,
                    row_number() OVER (PARTITION BY id
                                       ORDER BY CASE class
                                                  WHEN 'other'
                                                    THEN 1
                                                  ELSE
                                                    0
                                                END ASC,
                                                c DESC,
                                                d DESC) rn
                    FROM (SELECT id,
                                 class,
                                 count(*) c,
                                 max(date1) d
                                 FROM elbat
                                      GROUP BY id,
                                               class) x) y
       WHERE rn = 1;
© www.soinside.com 2019 - 2024. All rights reserved.