我如何根据多个条件进行计数

How do i Count based on multiple Conditions

我当前有 4 列 IdABC

 A     B    C
243    3    1
243    3    2
243    3    3
243    3    1
243    3    2
243    3    3
243    3    1
243    3    2
243    3    3
185    3    1
185    3    2
185    3    3
185    3    1
185    3    2
185    3    3
337    2    1
337    2    2
337    2    3
337    2    4
337    2    5
337    2    1
337    2    2
337    2    3
337    2    4
337    2    5
336    2    1
336    2    2
336    2    3
336    2    4
336    2    5

逻辑

结果看起来像

 A     B    C  count
243    3    1    0
243    3    2    0
243    3    3    0
243    3    1    1
243    3    2    1
243    3    3    1
243    3    1    2
243    3    2    2
243    3    3    2
185    3    1    0
185    3    2    0
185    3    3    0
185    3    1    1
185    3    2    1
185    3    3    1
337    2    1    0
337    2    2    0
337    2    3    0
337    2    4    0
337    2    5    0
337    2    1    1
337    2    2    1
337    2    3    1
337    2    4    1
337    2    5    1
336    2    1    0
336    2    2    0
336    2    3    0
336    2    4    0
336    2    5    0

也可以使用 B 列来了解 C 的最大值

我目前的尝试是

SELECT *, 
       1 + ((row_number() over(order by A, B, Id, C) - 1) / 
Case  B    WHEN 2 THEN 5
           ELSE 3 END)
 AS Test

第 1 部分的内容

When current C is < previous C then count +1

但不是第二部分

这是一种可能适用于 SQL Server 2008(没有 LEAD/LAG)的解决方案。主要思想是使用 PARTITION BY A 到 "reset" 计数器。 结果集有中间列,因此您可以遵循逻辑。它非常简单。

示例数据

DECLARE @T TABLE (ID int IDENTITY(1,1), [A] int, [B] int, [C] int);

INSERT INTO @T ([A], [B], [C])
VALUES
    (243, 3, 1),
    (243, 3, 2),
    (243, 3, 3),
    (243, 3, 1),
    (243, 3, 2),
    (243, 3, 3),
    (243, 3, 1),
    (243, 3, 2),
    (243, 3, 3),
    (185, 3, 1),
    (185, 3, 2),
    (185, 3, 3),
    (185, 3, 1),
    (185, 3, 2),
    (185, 3, 3),
    (337, 2, 1),
    (337, 2, 2),
    (337, 2, 3),
    (337, 2, 4),
    (337, 2, 5),
    (337, 2, 1),
    (337, 2, 2),
    (337, 2, 3),
    (337, 2, 4),
    (337, 2, 5),
    (336, 2, 1),
    (336, 2, 2),
    (336, 2, 3),
    (336, 2, 4),
    (336, 2, 5);

查询

WITH
CTE_Test
AS
(
    SELECT
        ID, A, B, C,
        1 + ((row_number() over(order by A, B, Id, C) - 1) / 
        Case B WHEN 2 THEN 5 ELSE 3 END) AS Test
    FROM @T
)
,CTE_Min
AS
(
    SELECT
        ID, A, B, C, Test
        , MIN(Test) OVER(PARTITION BY A) AS MinTest
    FROM CTE_Test
)
SELECT
    ID, A, B, C, Test, MinTest
    , Test - MinTest AS FinalCount
FROM CTE_Min
ORDER BY ID;

结果集

ID    A      B    C    Test    MinTest    FinalCount
1     243    3    1    3       3          0
2     243    3    2    3       3          0
3     243    3    3    3       3          0
4     243    3    1    4       3          1
5     243    3    2    4       3          1
6     243    3    3    4       3          1
7     243    3    1    5       3          2
8     243    3    2    5       3          2
9     243    3    3    5       3          2
10    185    3    1    1       1          0
11    185    3    2    1       1          0
12    185    3    3    1       1          0
13    185    3    1    2       1          1
14    185    3    2    2       1          1
15    185    3    3    2       1          1
16    337    2    1    5       5          0
17    337    2    2    5       5          0
18    337    2    3    5       5          0
19    337    2    4    5       5          0
20    337    2    5    5       5          0
21    337    2    1    6       5          1
22    337    2    2    6       5          1
23    337    2    3    6       5          1
24    337    2    4    6       5          1
25    337    2    5    6       5          1
26    336    2    1    4       4          0
27    336    2    2    4       4          0
28    336    2    3    4       4          0
29    336    2    4    4       4          0
30    336    2    5    4       4          0