选择SQL Server中符合特定条件的最后一组记录

时间:2015-10-27 22:44:16

标签: sql sql-server sql-server-2012

我有10条符合我搜索条件的记录。问题是有两组10条记录,一组在下午1点,一组在下午3点。我只想在下午3点设置。这是我的SQL的一部分:

    select shp_rev.ShpNum, shp_rev.RevTime
      from shp_rev
     where shp_rev.RevDate  = '10/1/2015'
       and shp_rev.ValAfter = 'O'
       and shp_rev.ShpNum   = 732809

(我已经将shp_rev.ShpNum添加到了将数据缩小到有这个问题的数据集的地方。通常我不会在那里有那个。还有其他字段将包含在此选择中。)

这会产生:

    732809 13:14:45
    732809 13:14:45
    ...
    732809 15:23:33
    732809 15:23:33
    ...

我只想在15:23:33记录。我知道我能做到的一种方法是在开始时将我想要的所有字段连接到ShpNum和RevTime的一个字符串中,然后使用MAX()来获得这样的3pm记录:

    select max(cast(shp_rev.ShpNum as varchar) + '~' + shp_rev.RevTime)
      from shp_rev
     where shp_rev.RevDate  = '10/1/2015'
       and shp_rev.ValAfter = 'O'
       and shp_rev.ShpNum   = 732809
     order by max(cast(shp_rev.ShpNum as varchar) + '~' + shp_rev.RevTime)

但是我必须解析该字符串才能获得所有内容。似乎必须有更好的方法。我曾尝试在ShpNum和RevTime上单独使用MAX(),但这并不起作用。有什么想法吗?哦,我在SQL Server 2012中工作。谢谢!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以使用dense_rank()

select s.*
from (select shp_rev.ShpNum, shp_rev.RevTime,
             dense_rank() over (partition by revdate, valafter, shipnum order by revtime desc) as seqnum
      from shp_rev
      where shp_rev.RevDate  = '2015-10-01' and
            shp_rev.ValAfter = 'O' and
            shp_rev.ShpNum   = 732809
     ) s
where seqnum = 1;

这假设时间戳都完全相同。