SQL MAX() 函数返回所有结果

标签 sql sql-server sql-server-2012 greatest-n-per-group

所以首先我想在这个问题前先让大家知道我对 sql 和编码非常陌生。我有一个疑问:

    Select Distinct 
[t1].[Name] AS Subdivision
, [t2].[Description] AS SubStatus
, [t4].[Name] AS ConnectingSubName
, [t2].[Description] As ConnectingSubStatus
, [t5].[ActualPublicationEndDate]
, MAX([t5].[version]) as Version

From [PtcDbTracker].[dbo].[TrackDatabase] as [t0]
INNER Join [PTCDbTracker].[dbo].[Subdivision] as [t1] on [t0].   [SubdivisionId]=[t1].[SubdivisionId]
Inner Join [PTCDbTracker].[dbo].[Status] as [t2] on [t1].[StatusId]=[t2].[StatusId]
Inner Join [PTCDbTracker].[dbo].[ConnectingSubs] as [t3] on [t0].[SubdivisionId]=[t3].[SubdivisionId] 
Inner Join [PTCDbTracker].[dbo].[Subdivision] as [t4] on ([t2].[StatusId]=[t4].[StatusId] AND [t3].[ConnectingSubId]=[t4].[SubdivisionId])
Inner Join [PtcDbTracker].[dbo].[TrackDatabase] as [t5] on t3.ConnectingSubId = t5.SubdivisionId

Where [t0].[SubdivisionId] = '90'
AND [t5].[Version] BETWEEN 8000 AND 9000

Group By t1.Name, t2.Description, t4.Name, t2.Description, t5.ActualPublicationEndDate

返回结果:

Subdivision     SubStatus    ConnectingSubName  ConnectingSubStatus       ActualPublicationEndDate      Version
San Bernardino  In Editing   Alameda Corridor   In Editing                2013-12-17 00:00:00.0000000   8000
San Bernardino  In Editing   Harbor             In Editing                2014-04-25 00:00:00.0000000   8001
San Bernardino  In Editing   Alameda Corridor   In Editing                2014-05-01 00:00:00.0000000   8001
San Bernardino  In Editing   Alameda Corridor   In Editing                2014-09-25 00:00:00.0000000   8002

我真正想要返回的是第 2 行和第 4 行。我知道 Group By 子句正在创建 1 个组,但如果我尝试取出任何内容,则会出现错误。任何帮助将不胜感激。我正在使用 MS Sql SMS 2012。

最佳答案

您想要使用row_number()。像这样的事情:

with t as (
      Select [t1].[Name] AS Subdivision, [t2].[Description] AS SubStatus,
             [t4].[Name] AS ConnectingSubName, [t2].[Description] As ConnectingSubStatus,
             [t5].[ActualPublicationEndDate], [t5].[version] as Version
      From [PtcDbTracker].[dbo].[TrackDatabase] [t0] INNER Join
           [PTCDbTracker].[dbo].[Subdivision] [t1]
           on [t0].[SubdivisionId] = [t1].[SubdivisionId] Inner Join
           [PTCDbTracker].[dbo].[Status] [t2]
           on [t1].[StatusId]=[t2].[StatusId] Inner Join
           [PTCDbTracker].[dbo].[ConnectingSubs] [t3]
           on [t0].[SubdivisionId]=[t3].[SubdivisionId] Inner Join
           [PTCDbTracker].[dbo].[Subdivision] [t4]
           on ([t2].[StatusId]=[t4].[StatusId] AND [t3].[ConnectingSubId]=[t4].[SubdivisionId]) Inner Join
          [PtcDbTracker].[dbo].[TrackDatabase] [t5]
           on t3.ConnectingSubId = t5.SubdivisionId
      Where [t0].[SubdivisionId] = '90' AND [t5].[Version] BETWEEN 8000 AND 9000
     )
select t.*
from (select t.*,
             row_number() over (partition by Subdivision, SubStatus,   ConnectingSubName
                                order by version desc) as seqnum
      from t
     ) t
where seqnum = 1

这使用 row_number() 获取每个实体的最大版本的行,然后返回该行。

关于SQL MAX() 函数返回所有结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29062626/

相关文章:

mysql - 如果任何行包含该键的指定值,如何选择该键的所有行

sql-server - 选择按日期排序的每组的前 N ​​行

sql - 如何从数据 View 中忽略与 'Arithmetic Overflow' 相关的错误?

php - 设置 MYSQL 远程连接并使用 PHP 从 Linux 主机连接

sql-server - sp_send_dbmail 因附件而失败

mysql - 从 SQL 获取日期

sql - 如何选择每组的第一行?

mysql - null 的警报数量小于特定值

sql-server - 在 SQL 多部分标识符中连接数据库名称

sql-server-2012 - 数据库项目中出现SQL70527错误