13

我有一个如下表:

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

任何帮助都感激不尽。谢谢。

4

2 回答 2

12

首先将日期 + 时间列组合成一个日期时间,以便对它们进行排序。自从我使用 Sql Server 以来已经有一段时间了,但是 row_number() 函数和分区是一种查找按另一列分组的列的最大值的简单方法 - 分区子句类似于 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
于 2013-08-23T01:24:26.640 回答
2

首先,您需要将日期字符转换为日期字段,以便您可以通过它进行订购。那么你可以做的是:

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

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

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

如果时间部分在结果中很重要,那么您可以按照@jeff 的建议将两者结合起来。

于 2013-08-23T01:33:49.197 回答