我有一系列的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
你想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)
这里有一个选择:
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
返回最小month_dt仅当flag_testdrive = 1给定的ID,包在聚结返回0而不是NULL的。