我有一个表需要进行一些数据转换。这是一个简单的跟踪表,如下所示:
-
SSN9,0 KEY(例如 123456789)非空
-
DATE8,0 KEY(例如 20131202)非空
-
TIME6,0 KEY(例如 133000)非空
-
打印_新Z(例如2013-12-02-11.23.47.965000)(使用CURRENT_TIMESTAMP)
非空
-
打印_旧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)
Results:
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/DATE 的最新时间,您就可以在主查询中 JOIN 返回它。
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)