如何在满足条件的情况下才按顺序在SQL中计数?

问题描述 投票:0回答:1

我有一张工作项上发生的“动作”表。我最初是使用 Row Number 和 Partition By 在表中按顺序计算每个动作,如下所示,它工作得很好。

当前表

+---------------+--------------------+-----------+-----------+--------------+
| Work Item Ref | Work Item DateTime | Auditable | Action ID | Action Count |
+---------------+--------------------+-----------+-----------+--------------+
|          2500 | 19/05/2023 10:01   | Yes       |        20 |            1 |
|          2501 | 19/05/2023 10:02   | Yes       |        11 |            1 |
|          2501 | 19/05/2023 10:03   | Yes       |         9 |            2 |
|          2501 | 19/05/2023 10:04   | No        |        19 |            3 |
|          2501 | 19/05/2023 10:06   | Yes       |         5 |            4 |
|          2502 | 19/05/2023 10:04   | No        |         2 |            1 |
|          2502 | 19/05/2023 10:05   | Yes       |         4 |            2 |
+---------------+--------------------+-----------+-----------+--------------+

代码

ROW_NUMBER() OVER(PARTITION BY [Work Item Ref] ORDER BY [Work Item DateTime] asc) AS [Action Count]

但是现在,我们需要相同的计数,但仅在“可审计”列显示为“是”的情况下。我尝试在

PARTITION BY
ORDER BY
之间添加一个 WHERE 子句,但意识到这不是正确的语法。当满足标准时,我需要它基本上only顺序计数。我怎样才能实现下面的例子?

想要的结果

+---------------+--------------------+-----------+-----------+--------------+
| Work Item Ref | Work Item DateTime | Auditable | Action ID | Action Count |
+---------------+--------------------+-----------+-----------+--------------+
|          2500 | 19/05/2023 10:01   | Yes       |        20 |            1 |
|          2501 | 19/05/2023 10:02   | Yes       |        11 |            1 |
|          2501 | 19/05/2023 10:03   | Yes       |         9 |            2 |
|          2501 | 19/05/2023 10:04   | No        |        19 |              |
|          2501 | 19/05/2023 10:06   | Yes       |         5 |            3 |
|          2502 | 19/05/2023 10:04   | No        |         2 |              |
|          2502 | 19/05/2023 10:05   | Yes       |         4 |            1 |
+---------------+--------------------+-----------+-----------+--------------+
sql sql-server window-functions
1个回答
3
投票

您可以将

row_number()
划分为附加列,并将其包装在
case
表达式中:

CASE WHEN auditable = 'Yes' THEN
    ROW_NUMBER() OVER(
        PARTITION BY [Work Item Ref], [Auditable]
        ORDER BY [Work Item DateTime]
    ) 
END AS [Action Count]
© www.soinside.com 2019 - 2024. All rights reserved.