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;
我有一个 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;