我有一个表需要进行一些数据转换。这是一个简单的跟踪表,如下所示:
- SSN 9,0 key (例如 123456789)非空
- 日期 8,0 key (例如 20131202)非空
- TIME 6,0 KEY(例如 133000)非空
- PRINT_NEW Z(例如2013-12-02-11.23.47.965000)(使用了CURRENT_TIMESTAMP) 非空
- PRINT_OLD Z(例如 2013-12-02-11.23.47.965000)(CURRENT_TIMESTAMP) 使用)可空
之前我将当前系统时间插入到 [TIME] 字段中,但是,我应该做的是从我在处理中加入的变更日志中插入 [TIME] 字段。
作为此转换的开始,我尝试从跟踪表中选择 [SSN]、[DATE]、[TIME],并从变更日志中选择 [TIME](跟踪中 [TIME] 的值)表实际上应该包含)。
但是,我遇到的问题是更改日志可以有多个条目,即使是在 1 个特定日期也是如此。例如,我的以下尝试返回以下内容:
SELECT DISTINCT a.SSN, a.DATE, a.TIME, b.TIME AS CORRECT_TIME
FROM trackTable a, changeLog b
WHERE (a.SSN = b.SSAN) AND (a.DATE = b.DATE)
结果:
SSN | DATE | TIME | CORRECT_TIME
123456789 | 20140117 | 94738 | 91541
123456789 | 20140117 | 94738 | 91542
678912345 | 20140123 | 124542 | 144557
678912345 | 20140123 | 124542 | 144558
678912345 | 20140123 | 124542 | 144559
678912345 | 20140123 | 124542 | 144600
我的问题是,如何只选择字段 [CORRECT_TIME] 的最新值?我一直在尝试连接和 where 子句的一些变体,但我对 SQL 还很陌生。
最佳答案
尝试通用表表达式。可以说,“with xxx as (...)”部分将在内存中创建一个临时表。该表将通过 GROUP BY SSN, DATE 包含 SSN 和 DATE 的每个唯一组合的 MAX(TIME) 的最新时间。
一旦您获得每个 SSN/日期的最新时间,您就可以在主查询中加入它。
with latest as (select ssn, date, max(time) as latest_time from changelog group by ssn, date)
select t.ssn, t.date, t.time, latest_time
from tracktable t join latest l on t.ssn = l.ssn and t.date = l.date
order by t.ssn, t.date, t.time;
关于sql - 仅返回具有最近 TIME 值的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22045416/