代码之家  ›  专栏  ›  技术社区  ›  user5566364

按不同类别分组的SQL查询

  •  0
  • user5566364  · 技术社区  · 1 年前

    我正在尝试编写一个查询,该查询将按某些列的不同组合进行分组,并给我' N '列的每个组合的记录。我已经能够使用单个列对其进行分类,但当它涉及多个列时,我无法正确分组。下面是表中数据的样子以及我期望的输出的示例。在这里 'N' = 2

    enter image description here

    预期输出:

    1. 每个列的唯一组合最多2条记录
    2. 选择哪2个记录并不重要。
    3. 如果有 < N 记录,然后返回所有行(即记录数不应超过 'N' ,但可以 <N

    enter image description here

    更新:能够获得所需的输出。我现在的问题是,如果有任何更有效的方法可以做到这一点,因为我需要在包含多个列的表上运行它,并且组合的数量会迅速增加。

    WITH SUBSET AS (
        SELECT [ServerName],[SKU],[Feature1],[Feature2],[Feature3],ROW_NUMBER() OVER (
              PARTITION BY [SKU], [Feature1], [Feature2],[Feature3] order by [ServerName]) AS [ROW NUMBER]
          FROM [tablename]
    )
    SELECT ServerName ,SKU ,Feature1 ,Feature2 ,Feature3 FROM [SUBSET]
    WHERE [SUBSET].[ROW NUMBER] <= 2
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   DebugCode    1 年前

    在SQL查询中使用ROW_NUMBER()函数为指定分组中的每一行分配一个序列号。在筛选之后,结果仅包括行号小于或等于“N”的行。

          SELECT column1, column2, column3, column4, column5
          FROM (
            SELECT column1, column2, column3, column4, column5,
            ROW_NUMBER() OVER (PARTITION BY column1, column2, column3 
                  ORDER BY column4, column5) AS row_num
            FROM custom_table
               ) t
          WHERE row_num <= 2
          ORDER BY column1, column2, column3, column4, column5;
    

    PARTITION BY子句指定分组所需的列,ORDER BY子句确定每组中行的编号顺序。