2014-02-20 114 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')