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

SQL MAX() Function returning All Results

首先,我想通过让每个人都知道我对 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

哪个 returns:

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

我真正想要 return 的是第 2 行和第 4 行。我知道 Group By 子句正在创建 1 组,但如果我尝试删除任何内容,我会收到错误消息。任何帮助将不胜感激。我正在使用 MS Sql SMS 2012.

您查询中的问题是 group by 中的 ActualPublicationEndDate 列,您需要将其从 group byselect 列表

中删除

相反,您可以使用 Row_Number 找到每个 Subdivision, SubStatus, ConnectingSubName and ConnectingSubStatus 的最大值 version

Select *
from 
(
select *,
       row_number() over(partition by Subdivision, SubStatus, ConnectingSubName, ConnectingSubStatus 
                          order by [t5].[version] desc) RN
From join..
..
) A
where RN=1

您似乎在查找 TrackDatabase 中版本最高的那一行。一种方法是 row_number()。一个简化的例子:

select  *
from    T1
join    (
        select  row_number() over (
                    partition by ConnectingSubId
                    order by version desc) as rn
        ,       *
        from    T2
        ) as t2
on      t1.SubId = t2.ConnectingSubId
        and t2.rn = 1 -- Latest version only

带有子查询的 join 的优点是您只需按一列进行分区。

您想使用 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() 获取每个实体的最大版本的行,然后 returns 该行。