sql-server - 查询以获取 "Most Recent"加入其他带有日期的表

标签 sql-server sql-server-2008

我有几张 table ,需要加入它们,但有一点不同。

表 #GradeChange 包含学生 ID、成绩更改的生效日期以及在该日期更改的成绩。表 #EventOccurrence 包含该学生在特定日期发生的事件。我需要找到事件发生时该学生的年级。这将是 #EventOccurrence 生效日期之前发生的 #GradeChange 的最新成绩。学生可能有多个事件发生,我们可以假设所有学生都至少有一个 #GradeChange 条目,其日期早于他们最早的事件。

这是 DDL:

    /* If the test table already exists, drop it */
     IF OBJECT_ID('TempDB..#GradeChange','U') IS NOT NULL
        DROP TABLE #GradeChange;

     IF OBJECT_ID('TempDB..#EventOccurrence','U') IS NOT NULL
        DROP TABLE #EventOccurrence;     

/* Create first temp table */ 
 CREATE TABLE #GradeChange 
        (
        ID varchar(6),
        EffectiveDate datetime,
        Grade varchar(50)
        );       

/* Populate it */        
INSERT INTO #GradeChange 
    (ID, EffectiveDate, Grade)
SELECT '678443','Jul  2 2009 11:30PM','Grade 3' UNION ALL
SELECT '678443','Jan 24 2007  2:40PM','Kindergarten - Half Day' UNION ALL
SELECT '678443','Jul  4 2007 11:09PM','Grade 1' UNION ALL
SELECT '678443','Jul  2 2008 11:35PM','Grade 2' UNION ALL
SELECT '718466','May 18 2009 11:50PM','Pre-Kindergarten' UNION ALL
SELECT '718466','Jul  2 2009 11:27PM','Kindergarten - Half Day' UNION ALL
SELECT '718466','Aug 27 2009 11:18PM','Pre-Kindergarten' UNION ALL
SELECT '718466','Jul  9 2010 11:18PM','Kindergarten - Half Day' UNION ALL
SELECT '718466','Aug  2 2010 11:14PM','Kindergarten';

/* Create 2nd temp table */
CREATE TABLE #EventOccurrence
    (
    ID varchar(6),
    EventDate datetime
    ); 

/* Populate it */
INSERT INTO #EventOccurrence
    (ID, EventDate)
SELECT '718466','Nov 16 2010 12:00AM' UNION ALL
SELECT '718466','May 20 2009 12:00AM' UNION ALL
SELECT '678443','Dec  7 2007 12:00AM';

所以这两个表看起来像这样:

Tables Example

预期结果如下所示:

Results Example

我玩过“MAX”、“MIN”和“OVER()”,但不太正确。我非常感谢任何帮助!

最佳答案

SELECT  *
FROM    #EventOccurrence eo
OUTER APPLY
        (
        SELECT  TOP 1 Grade
        FROM    #GradeChange gc
        WHERE   gc.id = eo.id
                AND gc.EffectiveDate <= eo.EventDate
        ORDER BY
                gc.EffectiveDate DESC
        ) gc

关于sql-server - 查询以获取 "Most Recent"加入其他带有日期的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4830500/

相关文章:

c# - 为什么我不能将数据插入到我的数据库中?

sql-server - 获取链接服务器状态的存储过程

sql - 在 Partition 上划分两行

sql-server-2008 - SQL 2008 镜像,处于 "restoring"状态

sql - 读取SQL死锁图

sql - 为什么 Microsoft SSMS 语法突出显示单词 "configuration"?

sql - 使用 TABLOCK、XLOCK 命令在 Microsoft SQL Server 2008 上出现间歇性死锁

java - Hibernate 违反 UNIQUE KEY 约束

由于权限问题,SQL Server 无法在数据库中创建表

SQL - 查找在另一个之前出现的总记录