sql - 如何从另一个表中按日期选择最新项目

标签 sql sql-server-2008

我有两个表“项目”和“计划”,我需要按创建日期从上一个计划中获取最近的项目:

Projects:
ProjectId, PlanId, StartDate, EndDate 
(guid)     (guid)  (datetime) (datetime)
-------------------------------------
00001,     00001,  1/1/2015   31/1/2015   
00001,     00002,  3/2/2015   15/2/2015   
00002,     00001,  1/2/2015   20/2/2015   
00002,     00002,  1/2/2015   21/2/2015   
00003,     00001,  1/3/2015   10/3/2015   

Plans:
PlanId, CreateDate
(guid)  (datetime)
--------------------
00001,   1/1/2015
00002,   5/2/2015

我编写了从上一个计划中获取单个项目的查询,但我无法编写查询来通过单个查询获取多个项目。

这是我的查询:

SELECT TOP 1 pr.ProjectId,
        pl.CreateDate,
        pr.StartDate,
        pr.EndDate
FROM   Projects pr
        INNER JOIN Plans pl
            ON  pr.PlanId = pl.PlanId
WHERE ProjectId = '000002'
ORDER BY pl.CreateDate DESC

期望的结果是(上一个计划中的所有项目):

ProjectId, PlanId, StartDate, EndDate
--------------------------------------
00001,     00002,  3/2/2015,  15/2/2015
00002,     00002,  1/2/2015,  21/2/2015
00003,     00001,  1/3/2015,  10/3/2015

更新: Gordon Linoff 给出了很好的答案,但它没有解决我的问题,因为他的两个查询都不采用“00003”项目(其最后一个计划是“00001”)。

我用“OVER Clause”编写了查询’(Stanislovas Kalašnikovas对此进行了注释)。

所以我发布了完整的答案,为 future 的谷歌用户解决了我的问题:

SELECT * FROM
    (SELECT 
        result.ProjectId, 
        result.CreateDate, 
        result.StartDate, 
        result.EndDate, 
        ROW_NUMBER() OVER (PARTITION BY ProjectId ORDER BY CreateDate DESC) AS RowNumber
    FROM ( 
            SELECT  pr.ProjectId AS ProjectId,
                    pl.CreateDate AS CreateDate,
                    pr.StartDate AS StartDate,
                    pr.EndDate AS EndDate
            FROM   Projects pr
            INNER JOIN Plans pl ON  pr.PlanId = pl.PlanId
            --WHERE ProjectId IN ('000001', '000003') --Filter
         ) AS result
) AS result
WHERE result.RowNumber = 1

最佳答案

您可以使用子查询来获取最新的计划。然后将其加入到项目中:

SELECT pr.ProjectId, pl.CreateDate, pr.StartDate, pr.EndDate
FROM (SELECT TOP 1 pl.*
      FROM plans pl
      ORDER BY pl.CreateDate DESC
     ) pl JOIN
     Projects pr
     ON pr.PlanId = pl.PlanId;
WHERE ProjectId = '000002'

另一种方法是仅使用TOP WITH TIES:

SELECT TOP 1 WITH TIES pr.ProjectId, pl.CreateDate, pr.StartDate, pr.EndDate
FROM plans pl
     Projects pr
     ON pr.PlanId = pl.PlanId;
WHERE ProjectId = '000002'
ORDER BY pl.CreateDate DESC

关于sql - 如何从另一个表中按日期选择最新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159411/

相关文章:

sql-server-2008 - SQL Server 2000 中 sp_addlinkedserver 的问题

mysql - 创建一个表,表名中有空格

mysql - 多个连接的奇怪 SQL 问题

SQL CASE WHEN <Value> IN 在 SQL Server 2005 上运行缓慢,但在 2000 上则不然

java - 使用 JAVA 和 SOAP Web 服务的 SSRS 呈现报告

sql - 什么操作类型在 SQL Server 2008 中调用了触发器?

sql-server-2008 - 搜索和排名短语(例如电影标题)

sql-server - 为什么 MyGeneration 存储过程生成器模板不起作用?

sql - 使用 ORDER BY 子句查询 View 时出现 Oracle 内部错误

sql - 添加 WHERE 约束后,Postgresql 查询速度莫名其妙地变慢