选择了事件发生的每个ID的第一次约会

问题描述 投票:0回答:2

我有一系列的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
sql sql-server tsql
2个回答
0
投票

你想CASEMIN()表达:

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)

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

返回最小month_dt仅当flag_testdrive = 1给定的ID,包在聚结返回0而不是NULL的。

© www.soinside.com 2019 - 2024. All rights reserved.