【问题标题】:SQL Server find most recent date rangeSQL Server 查找最近的日期范围
【发布时间】:2016-09-29 01:00:15
【问题描述】:

我有一个tableA 的日期范围:

tranid    item    startdate     enddate
---------------------------------------
1          A      1/1/2000      2/2/2005
2          A      5/1/2000      2/2/2005
3          B      7/8/2015      9/8/2015
4          C      4/10/2007     7/20/2008
5          C      4/10/2003     7/20/2005

如何编写 SQL 查询以仅选择最近的事务(例如最近的开始和结束日期)?

例如,对于 A,最近的日期范围是 5/1/2000 到 2/2/2005,对于 C,最近的日期范围是 C 4/10/2007 到 7/20/2008。

写这篇文章我完全不知所措,因为它看起来很容易,但实际上并非如此。

select item, max(enddate), max(startdate)
from tableA 
where max(enddate)
group by item, enddate, startdate

SQL Server 在类似的情况下返回与“有”相关的错误 - 聚合问题。

感谢 :)

【问题讨论】:

标签: sql sql-server date aggregate


【解决方案1】:

您有一个没有意义的where max(enddate),您也不需要在您的组中包含开始日期/结束日期,只需包含项目,所以请尝试:

select item, max(enddate), max(startdate)
from tableA
group by item

【讨论】:

    【解决方案2】:

    你需要ROW_NUMBER窗口函数

    :with cte as
    (
    Select Row_Number() Over(Partition by item order by startdate desc) RN,*
    From yourtable 
    )
    Select * 
    From cte 
    Where RN = 1
    

    【讨论】:

      【解决方案3】:

      这是一个经典的 arg-max 问题:您需要最近开始日期的行。

      你需要把问题分成两步:

      1. 计算每个项目的最近开始日期。
      2. 将最大结果与原始表连接以获得所需的行。

      解决方案:

      SELECT b.tranid, b.item, a.maxstartdate, b.enddate
      FROM
        (SELECT t.item, MAX(t.startdate) maxstartdate
         FROM t
         GROUP BY t.item) a
      JOIN t b
      ON a.maxstartdate = b.startdate AND a.item = b.item;
      

      希望对您有所帮助! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多