【问题标题】:SQL Server Selecting Records with most recent date timeSQL Server 选择具有最近日期时间的记录
【发布时间】:2013-08-25 22:25:14
【问题描述】:

我有一张如下表:

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

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

【问题讨论】:

  • MyDateMyTime的数据类型是什么?为什么不使用日期和时间的内置数据类型?
  • 目前它们是 int 和 nchar。但是,这并不重要,因为我从 csv 文件导入了这些数据,我可以为它们定义任何数据类型。

标签: sql


【解决方案1】:

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

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 的建议将两者结合起来。

【讨论】:

    【解决方案2】:

    首先将日期 + 时间列组合成一个日期时间,以便对它们进行排序。自从我使用 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
    

    【讨论】:

    • 如果这是您唯一想看的东西,那就太好了。如果我有其他我想要的联接和字段怎么办。这在哪里适合?
    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 2017-09-14
    • 2015-06-21
    • 2018-04-20
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多