【问题标题】:Lead and case expression线索和案例表达
【发布时间】:2019-02-06 17:39:20
【问题描述】:

我有这张桌子:

ID    Date
-----------------
1     1/1/2019
1     1/15/2019

预期输出:

ID   DATE      LEAD_DATE  
-------------------------
1    1/1/2019  1/14/2019
1    1/15/2019  SYSDATE

SQL:

SELECT 
    *,
    CASE 
        WHEN LEAD (a.date) OVER (PARTITION BY a.ID ORDER BY a.date) = TRUNC(a.date) THEN NULL
        ELSE LEAD (a.date) OVER (PARTITION BY a.id ORDER BY a.date) - NUMTODSINTERVAL(1,'second')
    END AS LEAD_DT
 FROM a

结果:

ID  DATE      LEAD_DATE
-------------------------
 1  1/1/2019    1/14/2019
 1  1/15/2019   

case表达式中null时可以加上系统日期吗?

【问题讨论】:

    标签: sql oracle lead case-expression


    【解决方案1】:

    使用NVL

    SELECT 
        a.*,
        NVL(CASE 
            WHEN LEAD (a.date) OVER (PARTITION BY H.ID ORDER BY a.date) = TRUNC(a.date) THEN NULL
            ELSE LEAD (a.date) OVER (PARTITION BY a.id ORDER BY a.date) - NUMTODSINTERVAL(1,'second')
        END, SYSDATE) AS LEAD_DT
    FROM a
    

    或者,更好:

    SELECT 
        a.*,
        CASE LEAD (a.date) OVER (PARTITION BY a.ID ORDER BY a.date)
            WHEN TRUNC(a.date) THEN SYSDATE
            WHEN NULL THEN SYSDATE
            ELSE LEAD (a.date) OVER (PARTITION BY a.id ORDER BY a.date) - NUMTODSINTERVAL(1,'second')
        END AS LEAD_DT
     FROM a
    

    【讨论】:

      【解决方案2】:

      使用COALESCE:

      SELECT a.*,
        CASE COALESCE(LEAD("Date") OVER (PARTITION BY ID ORDER BY "Date") - "Date", 0)
          WHEN 0 THEN SYSDATE
          ELSE LEAD("Date") OVER (PARTITION BY ID ORDER BY "Date") - INTERVAL '1' SECOND
        END AS LEAD_DT
      FROM a
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-08
        • 2015-08-18
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-12
        • 1970-01-01
        相关资源
        最近更新 更多