从表中获取每个eventtype的最新事件

时间:2013-11-29 02:44:35

标签: sql oracle

我有一个包含事件,时间戳和一些错误代码的表,并希望获得每个事件的最新信息。我正在使用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的精神来解决这个问题

2 个答案:

答案 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多个列很容易。

SQL Fiddle

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 |