sql-server - SQL Server - 选择有条件的最新记录

标签 sql-server select group-by

我有一张这样的 table 。

table :

ID  EnrollDate  ExitDate
1   4/1/16      8/30/16 
2   1/1/16      null
2   1/1/16      7/3/16
3   2/1/16      8/1/16
3   2/1/16      9/1/16
4   1/1/16      12/12/16
4   1/1/16      12/12/16
4   1/1/16      12/12/16
4   1/1/16      null
5   5/1/16      11/12/16
5   5/1/16      11/12/16
5   5/1/16      11/12/16

需要选择具有这些条件的最新记录。
  • 只有一个记录具有最近的注册日期 - 选择
  • 两个或更多共享相同的最近注册日期,并且只有一个记录具有 NULL 退出日期或最近退出日期 - 选择具有 null 的记录。如果没有空记录,则选择最近退出日期的记录
  • 两个或多个具有相同注册和退出日期的记录 - 如果存在这种情况,请不要选择那些记录

  • 所以上表的预期结果应该是:
    ID  EnrollDate  ExitDate
    1   4/1/16      8/30/16 
    2   1/1/16      null
    3   2/1/16      9/1/16
    4   1/1/16      null
    

    我用 group by 写了查询。我不确定如何选择条件 2 和 3。
    select t1.*  from table t1
    INNER JOIN(SELECT Id,MAX(EnrollDate) maxentrydate
    FROM table
    GROUP BY Id)t2 ON EnrollDate = t2.maxentrydate and t1.Id=t2.Id 
    

    请让我知道执行此操作的最佳方法是什么。

    最佳答案

    使用 rank()窗口函数,我认为是可能的。

    这是未经测试的,但它应该可以工作:

    select t.ID, t.EnrollDate, t.ExitDate
      from (select t.*,
                   rank() over(
                     partition by ID 
                     order by EnrollDate desc,
                              case when ExitDate is null then 1 else 2 end,
                              ExitDate desc) as rnk
              from tbl t) t
     where t.rnk = 1
     group by t.ID, t.EnrollDate, t.ExitDate
    having count(*) = 1
    

    基本思想是rank()窗口函数将对值为 1 的最近“最近”的行进行排名,我们在外部查询的 where 中对其进行过滤条款。

    如果多于一行具有相同的“最新”数据,它们将共享相同的排名 1 ,但会被 having count(*) = 1 过滤掉条款。

    关于sql-server - SQL Server - 选择有条件的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581969/

    相关文章:

    mySQL 从两个连接表中选择子查询中的数据总和

    c - 使用 termios 发送 AT 命令并获得回复的正确方法是什么

    sql-server - 合并语句错误调试

    MYSQL 从选择和变量中插入

    sql-server - OpenSQLServerInstanceRegKey :GetRegKeyAccessMask failed (reason: 2)

    mysql - 来自不同列的不同行数到一个表中

    ios - 核心数据结果分组依据

    mysql - 如何使用 MySQL 以三列为一组检索最新的对?

    asp.net - 有关将 ASP.NET 应用程序连接到 SQL Server 时的最佳实践的建议

    sql-server - MS-Access 查询到 T-SQL