【问题标题】:penultimate date for each record每条记录的倒数第二个日期
【发布时间】:2018-08-02 12:55:23
【问题描述】:

我正在努力创建选择,它显示了我数据库中每条记录的倒数第二个日期。

例如:

id  date
1   01.01.2018
1   05.01.2018
1   06.02.2018
2   01.06.2018
2   03.06.2018
3   12.12.2017

在这条记录中我需要写select,它显示了以下内容:

ID   max_date   penultimate
1   06.02.2018   05.01.2018
2   03.06.2018   01.06.2018
3   12.12.2017   NULL

知道怎么做吗?非常感谢提前

【问题讨论】:

  • 你使用的是哪种sql语言,也是什么版本
  • 我们正在运行 MSSQL 2012,使用 t-sql

标签: sql date


【解决方案1】:

使用条件聚合和 ANSI 标准 row_number()dense_rank() 函数:

select id,
       max(date) as max_date,
       max(case when seqnum = 2 then date end) as penultimate_date
from (select t.*,
             dense_rank() over (partition by id order by date desc) as seqnum
      from t
     ) t
where seqnum in (1, 2)
group by id;

如果出现平局时日期可以相同,请使用row_number()

【讨论】:

  • 在性能、灵活性、可维护性等方面,这比相关子查询答案恕我直言更好。
【解决方案2】:

使用GROUP BY 获取MAX 以及与另一个MAX 的相关子查询,但这次低于前者。

SELECT
    T.id,
    MAX(T.date) max_date,
    (
        SELECT
            MAX(N.date)
        FROM
            YourTable N
        WHERE
            N.id = T.id AND
            N.date < MAX(T.date)
    ) penultimate
FROM
    YourTable T
GROUP BY
    T.id

【讨论】:

    【解决方案3】:

    只是一个优化的查询:

    ;WITH cte AS
    (
        SELECT id AS ID
            ,[date] AS max_date
            ,LEAD ([date], 1, 0) OVER (PARTITION BY id ORDER BY [date] DESC) AS penultimate
            ,ROW_NUMBER() OVER(PARTITION BY id ORDER BY [date] DESC) AS RN
        FROM Table3
    )
    SELECT ID,max_date,penultimate
    FROM cte
    WHERE RN=1
    

    SQL Fiddle

    【讨论】:

      【解决方案4】:

      我是这样写的,

      SELECT ID
          ,max(StartDate) MaxDate
          ,(
              SELECT StartDate
              FROM YourTable t2
              WHERE t2.id = t1.id
              ORDER BY StartDate DESC OFFSET 1 ROWS FETCH NEXT 1 ROW ONLY
              ) penultimate
      FROM YourTable t1
      GROUP BY id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 2018-05-04
        • 2018-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多