SQL Server选择具有最新日期时间的记录

时间:2013-08-23 01:07:51

标签: sql

我有一张表格如下:

MyJob|   MyKey  |MyCode|MyDate| MyTime 
----------------------------------       
q183b| 0131081a |  24  |100315| 9:37        
q183b| 0131081a |  9   |100315| 11:38        
q183b| 0132426a |  1   |90314 | 15:36        
q183b| 0132426a |  2   |100315| 9:36        
q183b| 0132426a |  85  |100315| 11:36

请注意,MyDate格式为YYMMDD,MyTime为24小时格式。

我想用最新的MyDate和MyTime返回唯一MyKey的结果。预期的结果将是:

MyJob |   MyKey  |MyCode| MyDate | MyTime        
q183b | 0131081a | 9    | 100315 | 11:38        
q183b | 0132426a | 85   | 100315 | 11:36

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:6)

首先将日期+时间列合并到日期时间中,以便轻松订购它们。自从我使用Sql Server以来已经有一段时间了,但是row_number()函数和分区是一种简单的方法,可以找到一个列的另一个列的最大值 - partition子句类似于group by。

select t.* 
from
(
    select t.MyKey, t.MyDateTime
    , row_number() over 
         (partition by t.mykey order by t.MyDateTime desc) as keyOrderNbr
    from table t
) A
inner join table t
    on A.MyKey = t.MyKey 
    and A.MyDateTime = t.MyDateTime
where A.keyOrderNbr = 1

答案 1 :(得分:2)

首先,您需要将日期字符转换为日期字段,以便您可以按日期排序。然后你可以做的是:

SELECT DISTINCT *
FROM MyTable
WHERE MyTable.MyDate =
(
    SELECT MAX(Sub_MyTable.MyDate)
    FROM MyTable 
    WHERE MyTable.MyKey = Sub_MyTable.MyKey
);

现在请记住,除非您将字段转换为日期字段,否则MAX(MyDate)和其他对MyDate的引用将无法满足您的要求。我建议创建自己的函数将char字段转换为日期字段。

如果您尝试按原样按MyDate字段排序,您将按字母顺序排序结果,因为它是一个字符串。

如果时间部分在结果中很重要,那么您可以按照@jeff。

的建议将两者结合起来