【问题标题】:SQL Query Help - Get records based on MAX columnSQL 查询帮助 - 根据 MA​​X 列获取记录
【发布时间】:2011-12-02 13:49:38
【问题描述】:

给任何可以提供帮助的人。我不是 T-SQL 专家,所以我来这里寻求一些指导。我在 SQL Server 2005 中有一个表,其中每条记录都有一个修订号。我需要做的是显示表中只有最高修订号的所有记录。我已经为此工作了一段时间,并尝试将 MAX() 与子查询一起使用。我也尝试过带有 GROUP BY 子句的 HAVING 语句。我一定没有正确使用这些。

值得注意的是,我在此表中有很多列,但我在此示例中将其删除。 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]

这是无效的查询。

非常感谢您的帮助!

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql


    【解决方案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  
    

    【讨论】:

    • 我正在尝试这个: ;WITH CTE AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY [ChangeRequests].[F0] ORDER BY [ChangeRequests].[F8] DESC) AS RN FROM [S37] AS [ChangeRequests]) SELECT [ChangeRequests].[F0] AS [ID], [ChangeRequests].[F8] AS [RevisionNumber] /*Other columns */ FROM CTE WHERE RN = 1 我得到这个回复:无法绑定多部分标识符“ChangeRequests.F0”。无法绑定多部分标识符“ChangeRequests.F8”。
    • @user993514 您需要将查询的结尾更改为SELECT [CTE].[F0] AS [ID], [CTE].[F8] AS [RevisionNumber] /*Other columns */ FROM CTE WHERE RN = 1。表 [ChangeRequests] 无法在公用表表达式之外访问。
    【解决方案2】:

    现在 SQL Server 聚合函数支持 OVER 和 PARTITION BY 子句

    请尝试以下方法

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

    来自样本表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 2015-12-24
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多