如何在组中找到倒数第二个记录,否则找到最后一个

时间:2016-04-26 16:41:49

标签: sql sql-server

我有一个包含3个相关列的表:Serial_#Action_DateIG_Group。我有一个查询按其中的两列 - Serial_#Action_Date排序,以便结果每Serial_#有一个或多个条目。这告诉我序列被移动到新组的日期。实施例

Serial_#     Action_Date     IG_Group
4000001      2016-04-08      Group J
4000001      2016-04-07      Group F
4000001      2016-03-14      Group B
5000002      2016-04-19      Group J
6000003      2016-04-08      Group J
6000003      2015-10-19      Group A

我正在尝试找出一个序列在它现在所处的序列之前所处的IG_Group。如果只有一个条目(如上面的序列号5000002)那么我想要那个条目

1 个答案:

答案 0 :(得分:1)

您可以为具有窗口功能(大多数数据库支持)的每条记录执行此操作:

select t.*,
       coalesce(lag(ig_group) over (partition by serial_ order by action_date), 
from t;

对于最后一个,您可以使用条件聚合:

select t.serial_#
       max(case when seqnum = 1 then ig_group end) as last_ig_group,
       coalesce(max(case when seqnum = 2 then ig_group end),
                max(case when seqnum = 1 then ig_group end)
               ) as prev_ig_group_if_any
from (select t.*,
             row_number() over (partition by serial_ order by action_date desc) as seqnum
      from t
     ) t
group by t.serial_#;