sql - 仅返回具有最近 TIME 值的记录?

标签 sql ibm-midrange db2-400

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

  1. SSN 9,0 key (例如 123456789)非空
  2. 日期 8,0 key (例如 20131202)非空
  3. TIME 6,0 KEY(例如 133000)非空
  4. PRINT_NEW Z(例如2013-12-02-11.23.47.965000)(使用了CURRENT_TIMESTAMP) 非空
  5. 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/

相关文章:

excel - 在 JOIN 中使用 CASE 加速 SQL 查询

sql - 如何以编程方式在 as400 上运行复杂查询?

db2 - 在 DB2 SQL 中,如何终止已经陷入无限循环的递归函数调用?

mysql - 有条件地选择表格的某些部分

sql - 使用一张小表的值更新一张大表的性能

sql - 基于计数分组的 Active Record 对象

外网连接MYSQL

sql-server - 关闭 SQL Server/T-SQL 中的日记功能

java - JTOpen KeyedDataQueue 读取()超时

java - as400 使用克罗地亚数据创建 xml