在单独的列中返回最大日期和第二大日期,并按某些因素分组

时间:2019-04-26 14:48:26

标签: sql

为此苦苦挣扎。我需要返回最大日期,在某些情况下按1列将其分组,在第二列中将第二个最大日期返回。由于日期中有间隔,因此我无法使用DATEADD函数。所需的输出将具有三列(将因子分组,最大日期,第二大日期)和许多行。谢谢。

3 个答案:

答案 0 :(得分:0)

通用方法是使用row_number()和聚合。像这样:

select factor, max(date), min(date)
from (select t.*, row_number() over (partition by factor order by date) as seqnum
      from t
     ) t
where seqnum <= 2
group by factor;

如果重复,则它将两次返回相同的日期。如果要使用其他日期,请使用dense_rank()代替row_number()

答案 1 :(得分:0)

根据您的数据库,您也许可以使用Oracle中的NTH_VALUE函数之类的分析函数:

select partition_cols, max(date1) date1, max(date2) date2
from (
  select partition_cols
       , NTH_VALUE(Date_Col, 1) over (partition by partition_cols order by ... 
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) date1
       , NTH_VALUE(Date_Col, 2) over (partition by partition_cols order by ... 
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) date2
    from your_data) t
group by partition_cols

答案 2 :(得分:0)

另一种替代方法类似于戈登的替代方案,但使用枢轴:

with t1 as (
select factor
     , row_number() over (partition by factor order by your_date) rn
     , your_date
  from Your_Data
)
select * from t1 pivot (max(your_date) for rn in (1, 2)) x