2014-02-20 39 views
0

我使用下面的存储过程,以获得最新的日期了其正常工作的列从记录中获取数据。SQL服务器:与最大日期/最新日期

谁能告诉我我该怎么要修正这一点,我也得到这个记录中选择(即一个具有最大日)的数据的休息吗? 有问题的列被称为“更新”,并被格式化为日期时间,所以其中的值应该是唯一的。

实施例: 列“已更新”的最大值是行用“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') 

回答

3

你可以采取的分析方法:

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 
+0

由于你的分区,这个查询将选择** **最古老的一行**'col1','col2'和'col3' **的每个组合。 –

+0

错误地将'ASC'与'DESC'切换。固定。 – Mureinik

+0

您也错过了'OVER'关键字,并且您没有在子查询中选择更新'。 –

1
SELECT col1, col2, col3, col4, updated 
FROM MeetingDetails 
WHERE updated in (
    SELECT  MAX(updated) 
    FROM  MeetingDetails 
    WHERE  itemStatus = 'active' 
) 

这应该是你在找什么。从这里,如果您需要进一步缩小范围,只需在where子句中添加更多条件即可。

+0

谢谢,这是伟大的呢! – user2571510

1

下面是该查询:

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') 

基于多条记录怎么也最大(更新)这个选择可能返回多行,因此这种查询可以返回多个节点。

+0

谢谢,这太棒了! – user2571510

1

简单TOP 1条款与ORDER BY应该为你工作。

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')