SQL 数一数的个数
SQL counting the number of ones in sequence
我有以下 table,如您所见,ID 不一样。所以我不能做分组。我需要计算所有按顺序排列的。比如从 id 9 到 13,从 id 20 到 23。我该怎么做?
这是 LAG
和 LEAD
的解决方案。
;WITH StackValues AS
(
SELECT
T.*,
PreviousStatus = LAG(T.Status, 1, 0) OVER (ORDER BY T.ID ASC),
NextStatus = LEAD(T.Status, 1, 0) OVER (ORDER BY T.ID ASC)
FROM
#YourTable AS T
),
ValuesToSum AS
(
SELECT
L.*,
ValueToSum = CASE
WHEN L.Status = 1 AND L.PreviousStatus = 1 AND L.NextStatus = 0 THEN 1
ELSE 0 END
FROM
StackValues AS L
)
SELECT
Total = SUM(V.ValueToSum)
FROM
ValuesToSum AS V
LAG
将为您提供 N
前一行(本示例为 N = 1
),而 LEAD
将为您提供 N
下一行(N = 1
对于这个例子)。查询根据上一个和下一个值生成另一列 (ValueToSum
),并使用它的结果求和。
我有以下 table,如您所见,ID 不一样。所以我不能做分组。我需要计算所有按顺序排列的。比如从 id 9 到 13,从 id 20 到 23。我该怎么做?
这是 LAG
和 LEAD
的解决方案。
;WITH StackValues AS
(
SELECT
T.*,
PreviousStatus = LAG(T.Status, 1, 0) OVER (ORDER BY T.ID ASC),
NextStatus = LEAD(T.Status, 1, 0) OVER (ORDER BY T.ID ASC)
FROM
#YourTable AS T
),
ValuesToSum AS
(
SELECT
L.*,
ValueToSum = CASE
WHEN L.Status = 1 AND L.PreviousStatus = 1 AND L.NextStatus = 0 THEN 1
ELSE 0 END
FROM
StackValues AS L
)
SELECT
Total = SUM(V.ValueToSum)
FROM
ValuesToSum AS V
LAG
将为您提供 N
前一行(本示例为 N = 1
),而 LEAD
将为您提供 N
下一行(N = 1
对于这个例子)。查询根据上一个和下一个值生成另一列 (ValueToSum
),并使用它的结果求和。