我有一张这种结构的表
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
上下文
假设这张表是关于房子的,所以我有一个按顺序列出的房子。所以我有
所以我需要显示这些信息的浓缩。我需要说:
所以计数是基于顺序的。如果我能够在分区更改时重置 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/