首页 > 解决方案 > 我可以使用 RowNumber 对我的结果集进行分类吗?

问题描述

我有以下结果集:

ItemNumber | Item  
1          | a  
2          | b  
1          | c  
2          | d  
3          | e  
1          | f  
2          | g

我想对这些进行分类,以便结果集如下所示:

ItemNumber | Item  
1          | a  
1          | b  
2          | c  
2          | d  
2          | e  
3          | f  
3          | g

这就是我想说的,a并且b是链接的,因此按相同的 RowNumber 分类。

我正在努力使用 RowNumber Over Partition By... 让它工作

关于如何解决这个问题的任何建议?

我已经尝试过分区上的行号。这并没有给出我想要的结果:

SELECT ROW_NUMBER() OVER (PARTITION BY ItemNumber ORDER BY (SELECT NULL)) AS RowNumber,
       ItemNumber,
       Item
  FROM #List;

标签: sqlsql-server-2012window-functionsrankrow-number

解决方案


这将为您提供您所追求的结果,但是,如果我们所拥有的过于简化,我怀疑它是否会在您的生产环境中工作。如果 的值Item在您的数据库中实际上是按字母顺序排列的,那么这将起作用。ORDER BY如果没有,您要求的任务是不可能的,因为无法使用子句按照原始数据的顺序对行进行排序。

无论如何,需要注意的是,有条件的COUNT作品:

SELECT COUNT(CASE V.ItemNumber WHEN 1 THEN 1 END) OVER (ORDER BY V.Item ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ItemNumber,
       V.Item
FROM (VALUES(1,'a'),
            (2,'b'),
            (1,'c'),
            (2,'d'),
            (3,'e'),
            (1,'f'),
            (2,'g'))V(ItemNumber,Item);

您也可以实现上述目标ROW_NUMBER,但COUNT在我看来,a 是“更简单”的选项。

编辑:似乎没有使用 SQL Server 2012,正在使用不受支持的 SQL Server 版本。因此,此答案将不起作用;因为您需要支持的版本(2012+)才能使用ROWS BETWEEN. 无论如何我都会把它留在这里,以防在不久的将来升级 OP,这是强烈建议的。


推荐阅读