在SQL Server

时间:2017-05-09 15:19:31

标签: 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.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。

我该怎么做?

2 个答案:

答案 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')