【问题标题】:SQL Server filter query results to only include the item with the latest date [duplicate]SQL Server 筛选查询结果以仅包含日期最新的项目[重复]
【发布时间】:2018-09-20 05:34:41
【问题描述】:

我有以下查询,它返回一个项目的多个结果。我只想获得最新日期(最近)的 1 个项目。我目前正在获得每个有条目的日期的结果。

SELECT DISTINCT 
    [a].[Name]
  , [a].[IsGhostConvey]
  , [b].[AttorneyName]
  , [b].[IsGhostConveyAttorney]
  , [c].[InstitutionID]
  , [f].[Base_CreatedDate] AS 'DateLatestAccountOpened'
FROM 
    [Intermediary] [a]
INNER JOIN 
    [Attorney] [b] ON [a].[Name] = [b].[AttorneyName]
INNER JOIN 
    [IntermediaryInstitution] [c] ON [c].[IntermediaryID] = [a].[ID]
INNER JOIN  
    [IntermediaryBranch] [d] ON [d].[IntermediaryID] = [a].[Id]
INNER JOIN 
    [Matter] [e] ON [e].[BranchID] = [d].[Id]
INNER JOIN 
    [Account] [f] ON [f].[MatterID] = [e].[ID]
ORDER BY 
    [a].[Name], [f].[Base_CreatedDate] DESC;

我想我缺少WHEREGROUP BYHAVING 声明。

我的结果如下:

Name    IsGhostConvey   AttorneyName    IsGhostConveyAttorney   InstitutionID   DateLatestAccountOpened
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2017-10-05 08:46:47.573
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2017-05-25 09:00:24.853
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2017-03-03 10:07:01.753
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2016-12-15 08:47:59.393
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2016-11-09 14:55:29.763
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2016-11-09 14:54:11.877
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2016-05-30 08:43:47.993
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   NULL
Adriaan Booyens Attorneys   1   Adriaan Booyens Attorneys   1   1   2018-02-05 12:25:17.233
Adriaan Booyens Attorneys   1   Adriaan Booyens Attorneys   1   1   2017-06-14 10:25:42.687

但我想要这个:

Name    IsGhostConvey   AttorneyName    IsGhostConveyAttorney   InstitutionID   DateLatestAccountOpened
Adlam Attorneys - Benoni    1   Adlam Attorneys - Benoni    1   2   2017-10-05 08:46:47.573
Adriaan Booyens Attorneys   1   Adriaan Booyens Attorneys   1   1   2018-02-05 12:25:17.233

【问题讨论】:

  • 您可以尝试更改 ORDER BY f.Base_CreatedDate DESC, a.name。
  • 这仍然返回不需要的结果,只是排序不同

标签: sql sql-server


【解决方案1】:

您可以使用row_number() 进行这样的复杂查询:

with t as (
    SELECT a.Name, a.IsGhostConvey, b.AttorneyName, b.IsGhostConveyAttorney, c.InstitutionID, f.Base_CreatedDate AS 'DateLatestAccountOpened'
    FROM Intermediary a
    INNER JOIN Attorney b
    ON a.Name = b.AttorneyName
    INNER JOIN IntermediaryInstitution c
    ON c.IntermediaryID = a.ID
    INNER JOIN IntermediaryBranch d
    ON d.IntermediaryID = a.Id
    INNER JOIN Matter e
    ON e.BranchID = d.Id
    INNER JOIN Account f
    ON f.MatterID = e.ID
    )
select t.*
from (select t.*,
      row_number() over (partition by name order by DateLatestAccountOpened desc) as seqnum
      from t
     ) t
where seqnum = 1
order by Name, Base_CreatedDate DESC;

【讨论】:

  • 我在 row_number() 处(按 a.Name,f.Base_CreatedDate DESC 分区)作为 seqnum 得到““DESC”附近的语法不正确。删除 DESC 给我函数 'row_number' 必须有一个带有 ORDER BY 的 OVER 子句。
  • 只需将“order by”放在 OVER 子句中的 base_createddate 之前。发布时看起来像语法错误。
【解决方案2】:

你可以使用

GROUP BY (name)

每个名字只得到 1 个结果

【讨论】:

  • LIMIT 1 在 sql server 中无效。那是mysql的东西。
  • TOP 有用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多