如何在SQL数据库中统计每个用户ID出现的次数

How to count the number of occurrent of each user ID with conditions in SQL database

我在 MS SQL 中有一个 table,用于收集营销活动中每个 ID 的状态。每个月都有一栏检查每个消费者ID是否在营销活动中(is_in_programme),如果是,在每个月,他们是否是我们计划中的新人(is_new_apply ).每个ID可以在程序中多次申请

我的table包含日期时间(在每个月的最后一天报告,没有跳过月份),ID,我上面所说的每个ID的状态。我想检查在每个时期,每个 ID 在这个程序中出现了多少次(在 EXPECTED 列)。

在我的 Output 专栏中,我尝试使用 ROW_NUMBER() 函数,当 is_in_programme, is_new_apply 都是 1. 但是当 is_new_apply == 0

时我无法检查每个 ID 的出现
+------------+-------+-----------------+--------------+--------+----------+
|  datetime  |  ID   | is_in_programme | is_new_apply | Output | EXPECTED |
+------------+-------+-----------------+--------------+--------+----------+
| 31/01/2020 | 12345 |               1 |            1 |      1 |        1 |
| 29/02/2020 | 12345 |               1 |            0 |      0 |        1 |
| 31/03/2020 | 12345 |               1 |            0 |      0 |        1 |
| 30/04/2020 | 12345 |               1 |            0 |      0 |        1 |
| 31/05/2020 | 12345 |               0 |            0 |      0 |        0 |
| 30/06/2020 | 12345 |               1 |            1 |      2 |        2 |
| 31/07/2020 | 12345 |               1 |            0 |      0 |        2 |
| 31/08/2020 | 12345 |               1 |            0 |      0 |        2 |
| 31/01/2020 | 67890 |               0 |            0 |      0 |        0 |
| 29/02/2020 | 67890 |               1 |            1 |      1 |        1 |
| 31/03/2020 | 67890 |               1 |            0 |      0 |        1 |
| 30/04/2020 | 67890 |               0 |            0 |      0 |        0 |
| 31/05/2020 | 67890 |               0 |            0 |      0 |        0 |
| 30/06/2020 | 67890 |               1 |            1 |      2 |        2 |
| 31/07/2020 | 67890 |               1 |            0 |      0 |        2 |
| 31/08/2020 | 67890 |               1 |            0 |      0 |        2 |
| 30/09/2020 | 67890 |               0 |            0 |      0 |        0 |
| 31/10/2020 | 67890 |               1 |            1 |      3 |        3 |
| 30/11/2020 | 67890 |               1 |            0 |      0 |        3 |
| 31/12/2020 | 67890 |               1 |            0 |      0 |        3 |
+------------+-------+-----------------+--------------+--------+----------+

有没有什么方法可以像我的EXPECTED专栏那样检查每个ID在每个时期的营销活动中有多少次?

is_in_program 不是 0 时,您似乎想要 is_new_apply 的累加和。那将是:

select t.*,
       (case when is_in_program <> 0
             then sum(is_new_apply) over (partition by id order by datetime)
             else 0
        end) as expected
from t;