SQL获取最后一个日期时间记录[重复]
Posted
技术标签:
【中文标题】SQL获取最后一个日期时间记录[重复]【英文标题】:SQL get the last date time record [duplicate] 【发布时间】:2013-05-09 04:16:33 【问题描述】:我正在尝试从恰好存储多个状态的表中获取最后一个日期时间记录。 我的桌子是这样的:
+---------+------------------------+-------+
|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 |
+---------+------------------------+-------+
【问题讨论】:
【参考方案1】:如果您希望每个文件名有一行,反映特定状态并列出最近的日期,那么这就是您的朋友:
select filename ,
status ,
max_date = max( dates )
from some_table t
group by filename , status
having status = '<your-desired-status-here>'
简单!
【讨论】:
任何关于性能的cmets?假设他有数百万条记录,是否有优化的方法来执行此操作,或者他是否应该考虑将其放入最新记录的新表中? 这一切都取决于表上的索引。您必须检查执行计划。作为一般规则:在遇到问题之前不要优化。您可以在表上放置一个插入/更新/删除触发器,该触发器将维护一个汇总表,其中包含每个文件/状态组合的最新日期。但是,这会影响性能:对详细表的每个插入/更新/删除操作都必须修改汇总表。它还增加了数据库中的争用(因为您现在锁定了两个表而不是一个)。这也意味着您现在在数据库中有两个事实来源。 ORA-00923: FROM 关键字未在预期位置找到【参考方案2】:SELECT * FROM table
WHERE Dates IN (SELECT max(Dates) FROM table);
【讨论】:
如何考虑问题的多个状态部分? 它没有,它获取所有匹配最大日期的条目。 这是一个演示 -- sqlfiddle.com/#!3/c94a2/1 嗯,出于某种原因,这只会返回一条记录。这可能是因为我运行的是更旧的 sql (sql 2000) @Miguel- 你想获取所有文件的最后日期条目吗?还是所有日期最晚的条目?【参考方案3】:SELECT TOP 1 * FROM foo ORDER BY Dates DESC
将返回一个最新日期的结果。
SELECT * FROM foo WHERE foo.Dates = (SELECT MAX(Dates) FROM foo)
将返回所有具有相同最大日期的结果,精确到毫秒。
这适用于 SQL Server。如果您想使用日期而不是时间,我会留给您使用 DATEPART 函数。
【讨论】:
这是唯一一个对我有用的【参考方案4】:这个工作
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
【讨论】:
这个函数很棒,你可以创建递归循环来填充空数据。 自 SQL Server 2012 起:docs.microsoft.com/en-us/sql/t-sql/functions/… 最好将 FIRTS_VALUE 函数与您需要的 ORDER BY 排序顺序一起使用。因为 LAST_VALUE 函数需要特别是窗口框架,否则会导致错误的结果。【参考方案5】:考虑到每个文件名的 max(dates) 可能不同,我的解决方案:
select filename, dates, status
from yt a
where a.dates = (
select max(dates)
from yt b
where a.filename = b.filename
)
;
http://sqlfiddle.com/#!18/fdf8d/1/0
HTH
【讨论】:
【参考方案6】:确切的语法当然取决于数据库,但类似于:
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
【讨论】:
【参考方案7】:select max(dates)
from yourTable
group by dates
having count(status) > 1
【讨论】:
【参考方案8】:试试这个:
SELECT filename,Dates,Status
FROM TableName
WHERE Dates In (SELECT MAX(Dates) FROM TableName GROUP BY filename)
【讨论】:
这可能会为某些文件名返回额外的旧日期。 如何,请解释一下。 @wara 如果 fileA 的旧状态的日期与 fileB 的最新状态相匹配,那么您会在结果中看到旧的 fileA 状态(以及最新的 fileA 状态)。 我明白了,我假设基于他提供的数据集,他使用时间戳,因此旧文件和新文件具有相同时间戳的可能性较小。但我基本了解你的理论以上是关于SQL获取最后一个日期时间记录[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间
仅从 sql server 中的日期数据类型中获取日期 [重复]