【发布时间】:2021-02-04 16:14:47
【问题描述】:
我有一个包含以下列的 status_log 表:
User_id, isactive, date
1, 1, 1 Jan 2020
2, 1, 1 Jan 2020
3, 1, 2 Jan 2020
2, 0, 5 Jan 2020
4, 1, 10 Jan 2020
4, 0, 10 Jan 2020
3, 0, 12 Jan 2020
Isactive 表示用户从那天起是否处于活动状态,直到 isactive 设置为 false 的那一天。随后,用户可以决定再次变得活跃。以此类推。
我想返回一个包含 2 列的结果。第 1 列应该是从 status_log 表中的第一个日期开始的日期。无论日期是否在 status_log 表中,它都应该有一个日期。对于每一天,我都希望获得当天活跃的用户总数。总和应包括截至当天处于活动状态的所有用户 - 因此那些在该日期或之前将 isactive 设置为 true 并且之前没有将 inactive 设置为 false 的用户。
我正在尝试为此制定算法:
-
创建一个日期表,其中包含从表的第一个日期到最后一个日期的所有日期。
-
从第 1 步中的表和 status_log 表进行左连接。
-
我被困在这里 - 对于每一行,根据所有先前日期的分区执行总和,按日期排序,并且仅包括在当天或前一天设置了 isactive 的那些。如何确保逻辑仅限于活动用户。
预期输出:
Date, activeusers
1 Jan - 2
2 Jan - 3
3 Jan - 3
4 Jan - 3
5 Jan - 2
6 Jan - 2
7 Jan - 2
8 Jan - 2
9 Jan - 2
10 Jan - 2
11 Jan - 2
12 Jan - 1
【问题讨论】:
-
请展示一些示例数据和所需的输出
-
对于
Create a date table containing all the dates from 1st date of the table till last date,您可以使用永久日历表或recursive cte即时创建一个 -
我想知道是否有一种 SQL 方法来获取它而不是日期表。
-
提到的递归 cte?
标签: sql-server tsql