我有一个包含事件,时间戳和一些错误代码的表,并希望获得每个事件的最新信息。我正在使用oracle sql
TS eventType code
t1 A 1
t2 A 5
t3 BA 2
t4 A 1
t5 B 3
t6 B 1
t7 ZA -
t8 A 1
假设t严格增加,我正在寻找一个返回每个eventType A,B,C ......最新事件的查询。
TS eventType code
t3 BA 2
t6 B 1
t7 ZA -
t8 A 1
我的自然方法是循环和联合,但似乎没有简单的循环方式所以我希望有另一种方式更符合oracle sql的精神来解决这个问题
答案 0 :(得分:1)
其中一种方法是,
SELECT ts, eventtype, code
FROM table_name t1
WHERE ts = (SELECT MAX(ts)
FROM table_name t2
WHERE t1.eventtype = t2.eventtype);
或者您可以使用MAX()
分析函数来执行此操作,
SELECT ts, eventtype, code
FROM(
SELECT ts,
eventtype,
code,
MAX(ts) OVER (PARTITION BY eventtype) dt
FROM t
)
WHERE ts = dt
ORDER BY ts;
答案 1 :(得分:0)
分析函数是最有效的方法(成本最低的执行计划)我发现它可以解决这个问题,而且语法非常简单,不需要嵌套SELECT
,并允许你ORDER BY
多个列很容易。
Oracle 11g R2架构设置:
CREATE TABLE tbl ( TS, eventType, code ) AS
SELECT 't1', 'A', 1 FROM DUAL
UNION ALL SELECT 't2', 'A', 5 FROM DUAL
UNION ALL SELECT 't3', 'BA', 2 FROM DUAL
UNION ALL SELECT 't4', 'A', 1 FROM DUAL
UNION ALL SELECT 't5', 'B', 3 FROM DUAL
UNION ALL SELECT 't6', 'B', 1 FROM DUAL
UNION ALL SELECT 't7', 'ZA', NULL FROM DUAL
UNION ALL SELECT 't8', 'A', 1 FROM DUAL;
查询1 :
SELECT MAX( ts ) KEEP ( DENSE_RANK LAST ORDER BY ts ) AS ts,
eventType,
MAX( code ) KEEP ( DENSE_RANK LAST ORDER BY ts ) AS code
FROM tbl
GROUP BY eventType
ORDER BY ts
<强> Results 强>:
| TS | EVENTTYPE | CODE |
|----|-----------|--------|
| t3 | BA | 2 |
| t6 | B | 1 |
| t7 | ZA | (null) |
| t8 | A | 1 |