T-SQL: 如何根据最大日期 select 行?

T-SQL: How to select rows based on the max date?

我有一个 table,它有两个我想做出决定的字段:

- DATE
- DATE_LOADED

我想知道是否有 DATE(可能有很多关联行),例如“2016-06-15”,它有两个唯一的 DATE_LOADED 条目,'2016-06-16''2016-06-17',然后只取 MAX DATE_LOADED 行。

实际上,两份报告在同一天报告了重叠的数据。后来的报告是更正。所有列可能已更新,但 DATE。

提问:
对于每个日期(不仅仅是每一行),检查是否有多个 DATE_LOADED,如果有则取 与该日期相关的所有行 以及 [=29] =] = 该特定日期的 MAX DATE_LOADED。

我相信你正在寻找类似下面的内容

Select Date,MAX(DateLoaded)
From TableName    
Group By Date

此查询将为您提供 DATE 列表、该日期不同 DATE_LOADED 值的总数以及这些记录中的最大 DATE_LOADED 值。

SELECT DATE
   , COUNT(DISTINCT DATE_LOADED) AS [Total Different DATE_LOADED Values]
   , MAX(DATE_LOADED) AS [Max DATE_LOADED]
FROM YOURTABLE
GROUP BY DATE
HAVING COUNT(DISTINCT DATE_LOADED) > 1

我后来看到了这个

then take all lines associated with that DATE and where DATE_LOADED = MAX DATE_LOADED for that particular date.

这可以通过将上面的查询连接回您的 table 来完成。这将生成原始 table 中与上一个查询匹配的所有记录的结果。

SELECT yt.* 
FROM YOURTABLE AS yt INNER JOIN
    (SELECT DATE
       , MAX(DATE_LOADED) AS [Max DATE_LOADED]
    FROM YOURTABLE
    GROUP BY DATE
    HAVING COUNT(DISTINCT DATE_LOADED) > 1
    ) AS subQry ON yt.DATE = subQry.DATE AND yt.DATE_LOADED = subQry.[Max DATE_LOADED]

您可以为此目的使用 CROSS APPLY 或 INNER JOIN。以下是 CROSS APPLY 的示例。

SELECT  t.[DATE],
        t.DATE_LOADED    
FROM YourTable t
CROSS APPLY (
    SELECT MAX(DATE_LOADED) as MAX_DATE_LOADED 
    FROM YourTable 
    WHERE [DATE] = t.[DATE]) as p
WHERE t.DATE_LOADED = p.MAX_DATE_LOADED

例如,如果在您的 table 中有这样的内容:

DATE        DATE_LOADED
2016-06-15  2016-06-16
2016-06-15  2016-06-17
2016-06-15  2016-06-18
2016-06-15  2016-06-18

以上查询将为您提供:

DATE        DATE_LOADED
2016-06-15  2016-06-18
2016-06-15  2016-06-18

这可以使用 window 函数来完成

select *
from (
   select t.*, 
          row_number() over (partition by date order by date_loaded desc) as rn
   from the_table t
) x
where rn = 1;

如果有多行具有相同的最大日期,则以上只会 return 其中之一。如果你想要全部,你可以使用这样的东西:

select *
from (
   select t.*, 
          max(date_loaded) over (partition by date) as max_date_loaded
   from the_table t
) x
where date_loaded = max_date_loaded;

如果您只想使用单个 DATE_LOADED 过滤掉 DATE,您可以将查询增强为:

select *
from (
   select t.*, 
          max(date_loaded) over (partition by date) as max_date_loaded,
          count(*) over (partition by date) as cnt
   from the_table t
) x
where date_loaded = max_date_loaded
  and cnt > 1;