首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为每个id选择事件发生的第一个日期

为每个id选择事件发生的第一个日期
EN

Stack Overflow用户
提问于 2019-02-01 22:35:58
回答 2查看 365关注 0票数 0

我有一系列的Ids,其中一些在某个月激活一个产品,该产品在X个时间段内保持激活,而其他的不激活该产品。

我想创建一个列,指示用户在哪个月激活了产品,如果用户没有激活产品,则为NULL。

我尝试过使用如下分区:

代码语言:javascript
复制
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列中,我没有获得用户出现的第一个月,独立于他/她是在那个月还是在以后的一个月激活了该产品。

这就是我的查询得到的结果

代码语言:javascript
复制
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

我所期望的是:

代码语言:javascript
复制
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

这个解决方案是第二个最好的方案,但也很好:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-02-01 22:38:44

您需要在MIN()中使用CASE表达式:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-02-05 06:38:23

这里有一个选项供你选择:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54481638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档