2011-12-02 77 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)