2011-12-02 63 views
1

任何人都可以提供幫助。我不是T-SQL的專家,所以我來這裏尋求一些指導。我有一個SQL Server 2005中的表,每個記錄都有一個修訂版本號。我需要做的是隻顯示最高版本號的表中的所有記錄。我一直在研究這一段時間,並嘗試使用MAX()和子查詢。我也嘗試了帶GROUP BY子句的HAVING語句。我不能正確使用這些。SQL查詢幫助 - 基於MAX列獲取記錄

值得注意的是,我在這個表格中有很多列,但是我在這個例子中刪除了很多列。 GROUP BY是一個問題,因爲我必須在該子句中添加各種其他列(TEXT,NVARCHAR)。這導致我的記錄數量發生變化。 下面是一些樣本數據:

ID | RevisionNumber 

0|0 

0|1 

0|2 

1|0 

1|1 

1|2 

1|3 

1|4 

這裏是預期的結果:

ID | RevisionNumber 

0|2 

1|4 

我的SQL嘗試:

SELECT 
[ChangeRequests].[F0] AS [ID] 
,MAX([ChangeRequests].[F8]) AS [RevisionNumber] 
,[ChangeRequests].[F18] AS [ChangeNumber] 
,CAST([ChangeRequests].[F19] AS NVARCHAR) AS [Synopsis] 
,[ChangeRequests].[F30] AS [Responsibility] 
,CAST([ChangeRequests].[F32] AS NVARCHAR) AS [Description] 
,(CASE [ChangeRequests].[F42] WHEN 0 THEN NULL ELSE dbo.ConvertSTTimestamp([ChangeRequests].[F42]) END) AS [EnteredOn] 
FROM [S37] AS [ChangeRequests] 
GROUP BY 
[ChangeRequests].[F0] 
,[ChangeRequests].[F18] 
,CAST([ChangeRequests].[F19] AS NVARCHAR) 
,[ChangeRequests].[F30] 
,CAST([ChangeRequests].[F32] AS NVARCHAR) 
,[ChangeRequests].[F42] 

這是一個沒有工作的查詢。

非常感謝您的幫助!

回答

1
;WITH CTE 
    AS (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY ID 
             ORDER BY RevisionNumber DESC) AS RN 
     FROM YourTable) 
SELECT ID, 
     RevisionNumber 
     /*Other columns */ 
FROM CTE 
WHERE RN = 1 
+0

我想這一點: ;具有CTE AS(SELECT *, ROW_NUMBER()OVER(PARTITION BY [ChangeRequests]。[F0][ChangeRequests]。[F0] AS [ID], [ChangeRequests]。[F8] AS [RevisionNumber]。[ChangeRequests]。[F8] DESC)AS RN FROM [S37] AS [ChangeRequests]) SELECT [ChangeRequests] /*其他列*/ FROM CTE WHERE RN = 1 我得到這個回: 多部分標識符 「ChangeRequests.F0」 無法綁定。 無法綁定多部分標識符「ChangeRequests.F8」。 – Jared

+0

@ user993514您需要將查詢的末尾改爲'SELECT [CTE]。[F0] AS [ID],[CTE]。[F8] AS [RevisionNumber]/*其他列*/FROM CTE WHERE RN = 1'。在公共表格表達式之外不能訪問表格[ChangeRequests]。 –

+0

謝謝,工作很棒! – Jared

0

現在在SQL Server的聚集函數支持OVER和PARTITION BY子句

請從SampleTable嘗試以下

select distinct ID, max(RevisionNumber) over (partition by ID)