我有一系列的Ids,其中一些在某个月激活一个产品,该产品在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发布于 2019-02-01 22:38:44
您需要在MIN()中使用CASE表达式:
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)发布于 2019-02-05 06:38:23
这里有一个选项供你选择:
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。
https://stackoverflow.com/questions/54481638
复制相似问题