Sql server 在SQL Server中按日期时间获取最后一行

Sql server 在SQL Server中按日期时间获取最后一行,sql-server,max,aggregate,Sql Server,Max,Aggregate,我有以下SQL表: Id | Code | DateTime1 | DateTime2 1 3AA2 2017-02-01 14:23:00.000 2017-02-01 20:00:00.000 2 E323 2017-02-12 17:34:34.032 2017-02-12 18:34:34.032 3 DFG3 2017-03-08 09:20:10.032 2017-03-08 12:30:10.03

我有以下SQL表:

Id | Code | DateTime1                 | DateTime2
1    3AA2   2017-02-01 14:23:00.000     2017-02-01 20:00:00.000
2    E323   2017-02-12 17:34:34.032     2017-02-12 18:34:34.032
3    DFG3   2017-03-08 09:20:10.032     2017-03-08 12:30:10.032
4    LKF0   2017-04-24 11:14:00.000     2017-04-24 13:40:00.000
5    DFG3   2017-04-20 13:34:42.132     2017-04-20 15:12:12.132
6    DFG3   2017-04-20 13:34:42.132     NULL
Id是一个自动数字字段。 代码是字符串,Datetime1和DateTime2是datetime类型。DateTime1也不能为空,但datetime2可以为空

我希望通过datetime1(最大datetime1,最近的一个)获得最后一行,该行与具体代码匹配,并且datetime2设置为NULL

例如,考虑到上表,对于代码DFG3,我希望获得Id=6的行,其datetime1的最大日期,即“2017-04-20 13:34:42.132”

但现在想象一下以下情况:

Id | Code | DateTime1                | DateTime2
1    3AA2   2017-02-01 14:23:00.000    2017-02-01 20:00:00.000
2    E323   2017-02-12 17:34:34.032    2017-02-12 18:34:34.032
3    DFG3   2017-03-08 09:20:10.032    2017-03-08 12:30:10.032
4    LKF0   2017-04-24 11:14:00.000    2017-04-24 13:40:00.000
5    DFG3   2017-04-20 13:34:42.132    NULL
6    DFG3   2017-05-02 16:34:34.032    2017-05-02 21:00:00.032 
同样,考虑到上表,我希望获得相同的结果,即datetime1的最后一行(最大datetime1,最近的一行)与具体代码匹配,并且datetime2设置为NULL

然后,在代码DFG3的最后一种情况下,不必返回任何行,因为Id=6的行是代码DFG3的datetime1(最近)之前的最后一行,但不为NULL


如何执行此操作?

这将为您带来表中的所有最新代码,然后您只选择一个
datetime2为空的代码

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Code 
                                 ORDER BY DateTime1 Desc) as rn
    FROM yourTable
    ) as T
WHERE rn = 1   -- The row with latest date for each code will have 1
  and dateTime2 IS NULL
  and code = 'DFG3' -- OPTIONAL

这将为您带来表中的所有最新代码,然后您只选择
datetime2为null的代码

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Code 
                                 ORDER BY DateTime1 Desc) as rn
    FROM yourTable
    ) as T
WHERE rn = 1   -- The row with latest date for each code will have 1
  and dateTime2 IS NULL
  and code = 'DFG3' -- OPTIONAL

你能试试这个查询,让我知道它是否适合你的情况吗

Select * From [TableName] where [Code]='DFG3' and [datetime2] is null and [datetime1] = (select max([datetime1]) from [TableName] where [Code]='DFG3')

你能试试这个查询,让我知道它是否适合你的情况吗

Select * From [TableName] where [Code]='DFG3' and [datetime2] is null and [datetime1] = (select max([datetime1]) from [TableName] where [Code]='DFG3')

在第二种情况下你想要什么结果?你试过什么?第二种情况下你想要什么结果?你试过什么?