2011-07-14 25 views
1

我有許多行,其審計存儲在一個單獨的表中。使用一個選擇,我想獲得LatestStateLatestDate,PreviousStatePreviousDate。我真的不知道從哪裏開始爲此制定T-SQL查詢,但我猜測我需要在SELECT內部生成兩個子查詢(僞-code):AS-關鍵字和下一個最後一行的多列

SELECT 
    (SELECT [State], [Date] FROM Audits WHERE HighestID) AS ([LatestState], [LatestDate]) 
    (SELECT [State], [Date] FROM Audits WHERE NextHighestID) AS ([PreviousState], [PreviousDate]) 
FROM [Data] 

這可能嗎?謝謝!

編輯我使用的解決了這個連接:

SELECT ps1.Rating, ps1.DatePerformed, ps2.Rating AS PreviousRating, ps2.DatePerformed AS PreviousDate 
FROM [Data] 
LEFT JOIN [Audit] ps1 ON ps1.[ID] = (SELECT MAX(ID) FROM [Audit] WHERE [ProjectID] = p.[ProjectID]) 
LEFT JOIN [Audit] ps2 ON ps2.[ID] = (SELECT MAX(ID) FROM [Audit] WHERE [ProjectID] = p.[ProjectID] AND ID < ps1.ID) 

謝謝您的意見!

+0

這甚至不是僞代碼 - 你的'WHERE'沒有謂詞。 – Oded

回答

2

這會給你兩行信息。第一行是latest,第二行是previous :)。

select top (2) [State], [Date] 
from Audits 
order by ID desc 

如果你希望他們在一行中,你可以試試這個。

;with cte as 
(
    select top 2 [State], [Date], row_number() over(order by ID desc) as rn 
    from @Audits 
) 
select C1.State as LatestState, 
     C1.Date as LatestDate, 
     C2.State as PreviousState, 
     C2.Date as PreviousDate 
from cte as C1 
    cross join cte as C2 
where C1.rn = 1 and C2.rn = 2 
+1

我知道,我打字太久了。你使用ROW_NUMBER的方式比我的簡單得多,*但是!*你的查詢可能不會返回任何內容,特別是當表中只有一行時。 :)無論如何(先前提出)+1。 –

+0

@Andriy - 你已經從我+1了:)。 –

2

可以將一組別名不分配給一組這樣的列,因爲在SELECT列表中的子查詢被允許返回不超過一行一列。儘管如此,也可以指定一個別名列表,例如您想要的子查詢,作爲派生表,即當它位於FROM子句中時(也可以在連接的任一側,如果有的話)。一般來說它看起來像這樣:

… 
FROM 
    (subquery) table_alias (column_alias, column_alias, …) 
… 

所以你的解決方案可能是這樣的:

SELECT 
    latest.[LatestState], 
    latest.[LatestDate], 
    previous.[PreviousState], 
    previous.[PreviousDate] 
FROM 
    (
    SELECT [State], [Date] 
    FROM Audits 
    WHERE condition to find the highest ID 
) AS latest ([LatestState], [LatestDate]), /* comma join = CROSS JOIN */ 
    (
    SELECT [State], [Date] 
    FROM Audits 
    WHERE condition to find the next highest ID 
) AS previous ([PreviousState], [PreviousDate]) 

假設每個子查詢返回的具體哪一行,這應該非常給你你在找什麼。

如果你的SQL Server 2005或更高版本上,不過,你可以嘗試不同的方法:

WITH ranked AS (
    SELECT 
    State, 
    Date, 
    rn = ROW_NUMBER() OVER (ORDER BY ID DESC) 
    FROM Audits 
) 
SELECT 
    LatestState = MAX(CASE rn WHEN 1 THEN State END), 
    LatestDate = MAX(CASE rn WHEN 1 THEN Date END), 
    PreviousState = MAX(CASE rn WHEN 2 THEN State END), 
    PreviousDate = MAX(CASE rn WHEN 2 THEN Date END) 
FROM ranked 
WHERE rn BETWEEN 1 AND 2 

基本上,這個查詢使用條件聚集,以顯示排名最高的State & DateLatest值,第二高排名State & Date作爲Previous值。

有用的書:

+0

非常豐富。謝謝! – Leonard

相關問題