首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最大日期子查询SQL Server

最大日期子查询SQL Server
EN

Stack Overflow用户
提问于 2017-09-06 07:54:49
回答 3查看 2.4K关注 0票数 1

我试图在子查询中加入一个最大日期,但是我得到了一个错误。我在使用SQL服务器

代码语言:javascript
复制
SELECT Headcount.[Snapshot Date]
, Headcount.[ID]
, Assessment.[Assessment Date]
, Assessment.[Code]

FROM Headcount INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
WHERE Assessment.[Assessment Date] = 
                 (SELECT MAX(CAST(Assessment.[Assessment Date] as datetime)) 
                  FROM Assessmnet AS Z 
                  WHERE Z.[ID] = Assessment.[ID] 
                       AND Assessment.[Assessment Date] <= Headcount.[Snapshot Date]
                 )

但我发现了一个错误:

聚合可能不会出现在WHERE子句中,除非它位于包含在HAVING子句或select列表中的子查询中,并且正在聚合的列是外部引用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-06 08:02:25

您忘记了您在子查询中指定的别名Z。如果您在子查询中使用Assessment,那么他会考虑外部查询中的Assessment,因为Assessment在子查询中有名称Z

代码语言:javascript
复制
SELECT Headcount.[Snapshot Date]
, Headcount.[ID]
, Assessment.[Assessment Date]
, Assessment.[Code]

FROM Headcount INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
WHERE Assessment.[Assessment Date] = 
                 (SELECT MAX(CAST(Z.[Assessment Date] as datetime)) 
                  FROM Assessment AS Z 
                  WHERE Z.[ID] = Assessment.[ID] 
                       AND Z.[Assessment Date] <= Headcount.[Snapshot Date]
                 )
票数 0
EN

Stack Overflow用户

发布于 2017-09-06 08:02:25

问题在where条件的子查询中,请尝试如下所示:

代码语言:javascript
复制
SELECT
    Headcount.[Snapshot Date],
    Headcount.[ID],
    Assessment.[Assessment Date],
    Assessment.[Code]
FROM Headcount
INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
WHERE Assessment.[Assessment Date] =
(
    SELECT
        MAX(CAST(Assessment.[Assessment Date] AS DATETIME))
    FROM Assessmnet AS Z
    GROUP BY
        Z.ID
    HAVING Z.[ID] = Assessment.[ID]
           AND Assessment.[Assessment Date] <= Headcount.[Snapshot Date]
);
票数 0
EN

Stack Overflow用户

发布于 2017-09-06 08:02:43

您应该编写MAX(CAST(Z.[Assessment Date] as datetime))而不是MAX(CAST(Assessment.[Assessment Date] as datetime))。否则,您将在错误的表上进行聚合。

以下查询可能有效(未经测试!):

代码语言:javascript
复制
SELECT Headcount.[Snapshot Date]
, Headcount.[ID]
, Assessment.[Assessment Date]
, Assessment.[Code]
FROM Headcount
INNER JOIN Assessment ON Assessment.[ID] = Headcount.[ID]
WHERE Assessment.[Assessment Date] =
                 (SELECT MAX(CAST(Z.[Assessment Date] as datetime))
                  FROM Assessment AS Z
                  WHERE Z.[ID] = Assessment.[ID] 
                    AND Z.[Assessment Date] <= Headcount.[Snapshot Date])

您还可以重写它以使用为每个评估选择最近的行:

代码语言:javascript
复制
SELECT [Snapshot Date], [ID], [Assessment Date], [Code]
FROM (SELECT [Snapshot Date], [ID], [Assessment Date], [Code],
        ROW_NUMBER() OVER (PARTITION BY [ID] ORDER BY [Assessment Date] DESC) rn
      FROM Headcount JOIN Assessment USING ([ID])
      WHERE [Assessment Date] <= [Snapshot Date]) t
WHERE rn = 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46069693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档