SQL Server:从最大日期/最新日期的记录中获取数据
Posted
技术标签:
【中文标题】SQL Server:从最大日期/最新日期的记录中获取数据【英文标题】:SQL Server: Get data from record with max date / newest date 【发布时间】:2014-02-20 15:01:59 【问题描述】:我正在使用以下存储过程从可以正常工作的列中获取最新日期。
有人可以告诉我如何修改这一点,以便我还选择了该记录的其余数据(即具有最大日期的数据)? 有问题的列称为“更新”,并格式化为日期时间,因此那里的值应该是唯一的。
示例: “更新”列的最大值是“itemID”= 3 的行。 在这种情况下,我还希望选择该行中的其余数据,例如列称为 col1、col2、col3、col4 + 列“已更新”。
我的存储过程:
SET NOCOUNT ON;
SELECT CONVERT(VARCHAR(11), MAX(updated), 106) AS lastUpdated
FROM MeetingDetails
WHERE itemStatus = 'active'
FOR XML PATH('updates'), ELEMENTS, TYPE, ROOT('root')
【问题讨论】:
【参考方案1】:您可以采用分析方法:
SELECT *
FROM (SELECT col1, col2, col3, col4,
RANK() OVER (PARTITION BY col1, col2, col3
ORDER BY updated DESC) AS rk
FROM MeetingDetails
WHERE itemstatus = 'active') t
WHERE rk = 1
【讨论】:
由于您的分区,此查询将为col1
、col2
和 col3
的每个组合选择最旧行 .
错误地将ASC
切换为DESC
。固定。
您还缺少OVER
关键字,并且您没有在子查询中选择更新的`。
我今天真的不是最好的:-(谢谢@JonSenchyna
你也没有过滤掉itemStatus <> 'active'
的行。【参考方案2】:
SELECT col1, col2, col3, col4, updated
FROM MeetingDetails
WHERE updated in (
SELECT MAX(updated)
FROM MeetingDetails
WHERE itemStatus = 'active'
)
这应该是您正在寻找的。从这里开始,如果您需要进一步缩小范围,只需在 where 子句中添加更多条件即可。
【讨论】:
谢谢,这也很棒!【参考方案3】:这里是查询:
set nocount on;
select
md.col1,
md.col2,
-- ......
convert(varchar(11), md.updated, 106) as lastUpdated
from
MeetingDetails md
where
md.itemStatus = 'active'
and md.updated = (select max(updated)
from MeetingDetails
where itemStatus = 'active')
for xml path('updates'), elements, type, root('root')
根据有多少条记录具有 max(updated),此选择可能返回多于一行,因此此查询可能返回多个节点。
【讨论】:
谢谢,这也很棒!【参考方案4】:带有ORDER BY
的简单TOP 1
子句应该适合您。
SELECT TOP 1 col1, col2, col3, col4,
updated
FROM @MeetingDetails
WHERE itemStatus = 'active'
ORDER BY
updated DESC
FOR XML PATH('updates'), ELEMENTS, TYPE, ROOT('root')
【讨论】:
以上是关于SQL Server:从最大日期/最新日期的记录中获取数据的主要内容,如果未能解决你的问题,请参考以下文章