选择每个ID发生事件的开始日期

时间:2019-02-01 14:35:58

标签: sql sql-server tsql

我有一系列ID,其中一些在某个月份激活了产品,并且该产品在X一段时间内保持激活状态,而另一些则没有激活该产品。

我想创建一列来指示用户在哪个月激活产品,或者如果用户不激活它,则为NULL。

我尝试使用如下分区:

SELECT id, fl_testdrive, month_dt,
CASE WHEN fl_testdrive = 1 then min(month_dt) OVER(PARTITION BY id ORDER BY month_dt ROWS UNBOUNDED PRECEDING) else 0 end as month_testdrive
FROM Table_1

但是,当我尝试此解决方案时,在month_testdrive列中,我并没有获得用户出现的第一个月的信息,这与用户是否在当月或以后激活该产品无关。

这就是我的查询内容

Id   flag_testdrive   month_dt   month_testdrive
1         0               1            1
1         0               2            1
1         1               3            1
1         1               4            1
2         0               2            0
2         0               3            0
3         1               4            4
3         1               5            4

我期望的是


Id   flag_testdrive   month_dt   month_testdrive
1         0               1            3
1         0               2            3
1         1               3            3
1         1               4            3
2         0               2            0
2         0               3            0
3         1               4            4
3         1               5            4

此解决方案是第二好的,但也不错:

Id   flag_testdrive   month_dt   month_testdrive
1         0               1            0
1         0               2            0
1         1               3            3
1         1               4            3
2         0               2            0
2         0               3            0
3         1               4            4
3         1               5            4

2 个答案:

答案 0 :(得分:0)

您想要CASE中的MIN()表达式:

MIN(CASE WHEN fl_testdrive = 1 THEN month_dt ELSE 0 END) OVER(PARTITION BY id, flag_testdrive ORDER BY month_dt ROWS UNBOUNDED PRECEDING)

答案 1 :(得分:0)

这是您的选择:

DECLARE @Testdate TABLE(
id INT
,flag_testdrive INT
,month_dt INT
)

INSERT INTO @Testdate (
                          [id]
                        , [flag_testdrive]
                        , [month_dt]
                      )
VALUES(1,0,1)
,(1,0,2)
,(1,1,3)
,(1,1,4)
,(2,0,2)
,(2,0,3)
,(3,1,4)
,(3,1,5)

SELECT
*
,COALESCE((SELECT MIN([aa].[month_dt]) FROM @Testdate aa
                WHERE aa.[id] = a.id
                AND aa.[flag_testdrive] = 1), 0) AS month_testdrive
FROM @Testdate a

仅当flag_testdrive = 1时,返回给定ID的最小month_dt,合并后返回0而不是NULL。