如何在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;
我在 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
+------------+-------+-----------------+--------------+--------+----------+
| 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;