代码之家  ›  专栏  ›  技术社区  ›  Pat

使用多个列的SQL顺序(使用case)

  •  1
  • Pat  · 技术社区  · 6 年前

    表:

    NUMBER DETAIL_ID,
    Date schdeuledDate;
    Date completedDate;
    NUMBER recordId;
    

    我正在尝试实现这一点,检索记录最近的完成日期,如果为空,则检索最近的计划日期;如果检索到多个记录,则使用更高的recordid。

    SELECT DETAIL_ID,completedDate,schdeuledDate,recordId FROM table
    ORDER BY CASE completedDate WHEN NULL THEN schdeuledDate ELSE completedDate END,DETAIL_ID,recordId DESC;
    

    但这就是我从上面的问题中得到的

    Detail_ID  compdate     schdate    recordId
    318        08-AUG-16    15-AUG-16   22342
    318        06-JUN-18    22-AUG-18   26219
    318        22-AUG-17    08-AUG-17   26218
    418        null         08-AUG-17   26450
    418        22-AUG-17    22-AUG-18   26879
    418        22-AUG-17    22-AUG-18   26779 
    

    预期:

    318        06-JUN-18    22-AUG-18   26219
    418        22-AUG-17    22-AUG-18   26879
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    我想你想要 row_number()

    select t.*
    from (select t.*,
                 row_number() over (partition by detail_id
                                    order by coalesce(schdeuledDate, completedDate) desc, recordId desc
                                   ) as seqnum
          from t
         ) t
    where seqnum = 1;