我有一系列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
答案 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。