仅返回最近TIME值的记录?

时间:2014-02-26 15:09:23

标签: sql ibm-midrange db2-400

我有一个表,我需要进行一些数据转换。这是一个简单的跟踪表,如下所述:

  1. SSN 9,0 KEY(例如123456789)NON-NULL
  2. DATE 8,0 KEY(例如20131202)NON-NULL
  3. TIME 6,0 KEY(ex.133000)NON-NULL
  4. PRINT_NEW Z(ex.2013-12-02-11.23.47.965000)(使用CURRENT_TIMESTAMP) 非空
  5. PRINT_OLD Z(例如2013-12-02-11.23.47.965000)(CURRENT_TIMESTAMP) 使用)NULLABLE
  6. 之前我将当前系统时间插入[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的新手。

4 个答案:

答案 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