我正在尝试从恰好存储多个状态的表中获取最后一个日期时间记录。 我的表看起来像这样:
+---------+------------------------+-------+
|filename |Dates |Status |
+---------+------------------------+-------+
|abc.txt |2012-02-14 12:04:45.397 |Open |
|abc.txt |2012-02-14 12:14:20.997 |Closed |
|abc.txt |2013-02-14 12:20:59.407 |Open |
|dfg.txt |2012-02-14 12:14:20.997 |Closed |
|dfg.txt |2013-02-14 12:20:59.407 |Open |
+---------+------------------------+-------+
结果应为
+---------+------------------------+-------+
|filename |Dates |Status |
+---------+------------------------+-------+
|abc.txt |2013-02-14 12:20:59.407 |Open |
|dfg.txt |2013-02-14 12:20:59.407 |Open |
+---------+------------------------+-------+
答案 0 :(得分:27)
如果你想为每个文件名添加一行,反映特定的状态并列出最近的日期,那么这就是你的朋友:
select filename ,
status ,
max_date = max( dates )
from some_table t
group by filename , status
having status = '<your-desired-status-here>'
容易!
答案 1 :(得分:26)
SELECT * FROM table
WHERE Dates IN (SELECT max(Dates) FROM table);
答案 2 :(得分:9)
SELECT TOP 1 * FROM foo ORDER BY Dates DESC
将使用最新日期返回一个结果。
SELECT * FROM foo WHERE foo.Dates = (SELECT MAX(Dates) FROM foo)
将所有具有相同最大日期的结果返回到milissecond。
这适用于SQL Server。如果你想使用日期而不是时间,我会留给你使用DATEPART功能。
答案 3 :(得分:5)
这个工作
SELECT distinct filename
,last_value(dates)over (PARTITION BY filename ORDER BY filename)posd
,last_value(status)over (PARTITION BY filename ORDER BY filename )poss
FROM distemp.dbo.Shmy_table
答案 4 :(得分:1)
确切的语法当然取决于数据库,但类似于:
SELECT * FROM my_table WHERE (filename, Dates) IN (SELECT filename, Max(Dates) FROM my_table GROUP BY filename)
这将为您提供您要求和上面显示的结果。小提琴:http://www.sqlfiddle.com/#!2/3af8a/1/0
答案 5 :(得分:1)
考虑到每个文件名的max(日期)可能不同,我的解决方案是:
select filename, dates, status
from yt a
where a.dates = (
select max(dates)
from yt b
where a.filename = b.filename
)
;
http://sqlfiddle.com/#!3/c94a2/2
HTH
答案 6 :(得分:0)
select max(dates)
from yourTable
group by dates
having count(status) > 1
答案 7 :(得分:-3)
试试这个:
SELECT filename,Dates,Status
FROM TableName
WHERE Dates In (SELECT MAX(Dates) FROM TableName GROUP BY filename)