我有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中工作。谢谢!
答案 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;
这假设时间戳都完全相同。