代码之家  ›  专栏  ›  技术社区  ›  Nicolás Abuchar Moya

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

  •  0
  • Nicolás Abuchar Moya  · 技术社区  · 5 年前

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

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

    我试过使用如下分区:

    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
    
    2 回复  |  直到 5 年前
        1
  •  0
  •   Yogesh Sharma    5 年前

    你想要 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)
    
        2
  •  0
  •   Tim Mylott    5 年前

    以下是您的选择:

    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的最小月日期,包装在coalesce中返回0而不是null。