首页 > 解决方案 > 如何连接两个字段并在 WHERE 子句中使用结果?

问题描述

我必须根据日期时间信息获取所有最旧的记录。

数据

Id |  External Id | Date                | Time
1  |  1000        | 2020-08-18 00:00:00 | 02:30:22
2  |  1000        | 2020-08-12 00:00:00 | 12:45:51
3  |  1556        | 2020-08-17 00:00:00 | 10:09:01
4  |  1919        | 2020-08-14 00:00:00 | 18:19:18
5  |  1919        | 2020-08-14 00:00:00 | 11:45:21
6  |  1919        | 2020-08-14 00:00:00 | 15:54:15

预期结果

Id |  External Id | Date                | Time
2  |  1000        | 2020-08-12 00:00:00 | 12:45:51
3  |  1556        | 2020-08-17 00:00:00 | 10:09:01
5  |  1919        | 2020-08-14 00:00:00 | 11:45:21

我目前正在这样做

SELECT *
FROM RUN AS T1
WHERE CONCAT(T1.DATE, T1.TIME) = (
     SELECT MIN(CONCAT(T2.DATE, T2.TIME))
     FROM RUN AS T2
     WHERE T2.EXTERNAL_ID = T1.EXTERNAL_ID
)

这是正确的做法吗?

谢谢,问候

更新 1:数据类型

DATE列是datetime

TIME列是varchar

标签: sqlsql-serversql-server-2012window-functions

解决方案


您可以使用窗口函数,例如DENSE_RANK()

SELECT ID, External_ID, Date, Time
  FROM 
  (
   SELECT DENSE_RANK() OVER (PARTITION BY External_ID ORDER BY Date, Time) AS dr,
          r.*
     FROM run r 
   ) AS q
 WHERE dr = 1

Demo


推荐阅读