我在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是日期时间类型。 DateTime1也不能为null,但datetime2可以是。
我想通过datetime1(MAX 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的最后一行(Max datetime1,最近的一行)与具体代码匹配,并且datetime2设置为NULL。
然后,在代码DFG3的最后一种情况下,必须返回任何行,因为Id = 6的行是代码DFG3的最后一个datetime1(最新的)但不是NULL。
我该怎么做?
答案 0 :(得分:1)
这会为您提供桌面上的所有最新代码,然后您只选择datetime2 is 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
答案 1 :(得分:1)
您可以尝试此查询,并告诉我它是否适合您的情况
Select * From [TableName] where [Code]='DFG3' and [datetime2] is null and [datetime1] = (select max([datetime1]) from [TableName] where [Code]='DFG3')