我有一个表,我需要进行一些数据转换。这是一个简单的跟踪表,如下所述:
之前我将当前系统时间插入[TIME]字段,但是,我应该做的是从我加入的更改日志中插入[TIME]字段进行处理。
作为此转换的开始,我尝试从跟踪表中选择[SSN],[日期],[时间],并从更改日志中选择[时间](跟踪中的[时间]值]表应该包含)。
然而,我遇到的问题是更改日志可能有多个条目,即使在特定日期也是如此。例如,我的下面尝试返回以下内容:
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]的MOST RECENT值?我一直在尝试一些连接和where子句的变体,但我仍然是SQL的新手。
答案 0 :(得分:3)
尝试使用公用表表达式。 &x ;; xxx为(...)'部分将在内存中创建一个临时表,可以这么说。该表将包含通过GROUP BY SSN,DATE为SSN和DATE的每个唯一组合通过MAX(TIME)的最新时间。
一旦您获得每个SSN / DATE的最新时间,您可以在主查询中加入回来。
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;
答案 1 :(得分:2)
with tbl as (select ssan, date, max(time) as correct_time
from changelog group by ssan, date
)
select a.SSN, a.DATE, a.TIME, b.CORRECT_TIME
from tracktable a
join tbl b on (a.SSN = b.SSAN) AND (a.DATE = b.DATE)
答案 2 :(得分:0)
尝试这样的事情:
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)
ORDER BY CORRECT_TIME
FETCH FIRST 1 ROW ONLY
答案 3 :(得分:0)
您可以使用窗口/分析函数执行此操作:
SELECT SSN, DATE, TIME, CORRECT_TIME
FROM (SELECT a.SSN, a.DATE, a.TIME, b.TIME AS CORRECT_TIME,
max(b.TIME) over (partition by a.SSN) as MAX_CORRECT_TIME
FROM trackTable a join
changeLog b
on a.SSN = b.SSAN AND a.DATE = b.DATE
) ab
WHERE CORRECT_TIME = MAX_CORRECT_TIME;
首先,请注意我已将join
更改为使用带有join
子句的显式on
语法。这比where
子句中的隐式连接要好得多。
其次,这假设你想要整体的最新时间。如果您想在每个日期使用最新版本,请将partition by
子句更改为a.SSN, a.DATE