sql-server - 根据行顺序获取计数

标签 sql-server sql-server-2016

我有一张这种结构的表

Create Table Example (
[order] INT,
[typeID] INT
)

有了这个数据:
order|type
1   7
2   11
3   11
4   18
5   5
6   19
7   5
8   5
9   3
10  11
11  11
12  3

我需要根据顺序获取每种类型的计数,例如:
type|count
7      1
11     **2**
18     1
5      1
19     1
5      **2**
3      1
11     **2**
3      1

上下文

假设这张表是关于房子的,所以我有一个按顺序列出的房子。所以我有
  • 订单 1:红房子
  • 2:白宫
  • 3:白宫
  • 4:红房子
  • 5:蓝色房子
  • 6: 蓝色的房子
  • 7:白宫

  • 所以我需要显示这些信息的浓缩。我需要说:
  • 我有 1 个红房子
  • 然后我有 2 个白色的房子
  • 然后我有 1 个红房子
  • 然后我有 2 个蓝房子
  • 然后我有 1 个白宫

  • 所以计数是基于顺序的。如果我能够在分区更改时重置 RANK,那么 DENSE_RANK 函数会对我有所帮助。

    最佳答案

    此解决方案使用递归 CTE 并依赖于无间隙 order 值。如果你没有这个,你可以用 ROW_NUMBER() 动态创建它:

    DECLARE @mockup TABLE([order] INT,[type] INT);
    INSERT INTO @mockup VALUES
     (1,7)
    ,(2,11)
    ,(3,11)
    ,(4,18)
    ,(5,5)
    ,(6,19)
    ,(7,5)
    ,(8,5)
    ,(9,3)
    ,(10,11)
    ,(11,11)
    ,(12,3);
    
    WITH recCTE AS
    (
        SELECT m.[order]
              ,m.[type] 
              ,1 AS IncCounter
              ,1 AS [Rank]
        FROM @mockup AS m
        WHERE m.[order]=1
    
        UNION ALL
    
        SELECT m.[order]
              ,m.[type]
              ,CASE WHEN m.[type]=r.[type] THEN r.IncCounter+1 ELSE 1 END
              ,CASE WHEN m.[type]<>r.[type] THEN r.[Rank]+1 ELSE r.[Rank] END
        FROM @mockup AS m
        INNER JOIN recCTE AS r ON m.[order]=r.[order]+1
    )
    SELECT recCTE.[type]
          ,MAX(recCTE.[IncCounter])
          ,recCTE.[Rank]
    FROM recCTE
    GROUP BY recCTE.[type], recCTE.[Rank];
    

    如果类型不变,则递归向下遍历增加计数器,如果类型不同则增加等级。

    剩下的就是一个简单的 GROUP BY

    关于sql-server - 根据行顺序获取计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45337086/

    相关文章:

    创建 jar 后出现 java.lang.ClassNotFoundException : com. microsoft.sqlserver.jdbc.SQLServerDriver

    sql-server - 为 SQL Server 企业管理器编写一个插件/表单

    c# - 在 Windows Server 2012 上将 IIS 连接到 SQL Server 2014

    sql - 简单查询的选择性估计错误

    sql - 执行此操作之前,请在数据库中创建主 key 或在 session 中打开主 key

    encryption - 使用每个用户数据的单独 key 加密 SQL Server Azure 数据库中的数据

    SQL Server 2012 : How to script all database stored procedures into separate . SQL 文件?

    sql-server - SQL Server 2016 始终加密 - 使用 View 中始终加密的列进行比较和计算表达式

    sql-server - OPENJSON 在 SQL Server 中不起作用?

    SQL Server 触发器 : multi-part identifier could not be bound