分组选择结果

时间:2015-12-14 15:04:37

标签: oracle select grouping

查询提供像这样的输出

ID  TYPE    CN  VAL
-----------------------------
1   D   CH  A
1   K   null    null
1   K   null    null
1   K   null    null
1   D   CH  A
1   K   null    null
1   D   CH  B
1   K   null    null
2   D   CH  A
2   K   null    null
3   D   CH  C
3   K   null    null
3   K   null    null
3   K   null    null
3   K   null    null
3   K   null    null
3   K   null    null

我想扩展这个看起来像

ID  TYPE    CN  VAL enum
-----------------------------
1   D   CH  A   1
1   K   null    null    1
1   K   null    null    1
1   K   null    null    1
1   D   CH  A   2
1   K   null    null    2
1   D   CH  B   3
1   K   null    null    3
2   D   CH  A   4
2   K   null    null    4
3   D   CH  C   5
3   K   null    null    5
3   K   null    null    5
3   K   null    null    5
3   K   null    null    5
3   K   null    null    5
3   K   null    null    5

怎么办呢?滞后/超前?

1 个答案:

答案 0 :(得分:0)

要扩展我的评论,这应该会让您和使用最后一个值的想法。 (不知道你实际上是如何订购的,所以我按照rownum订购,你可能应该更改为你订购的任何东西)你也可能想要在val和lv之间添加某种case语句或解码,使它看起来像你的结果集。无论如何mytable代表你的桌子。

WITH mytable AS (SELECT   1 id,
                          'D' TYPE,
                          'CH A' CN,
                          1 val
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'K',
                          NULL,
                          NULL
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'K',
                          NULL,
                          NULL
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'K',
                          NULL,
                          NULL
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'D',
                          'CH A',
                          2
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'K',
                          NULL,
                          NULL
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'D',
                          'CH B',
                          3
                   FROM   DUAL
                 UNION ALL
                 SELECT   1,
                          'K',
                          NULL,
                          NULL
                   FROM   DUAL)
SELECT   mytable.*,
         LAST_VALUE (val IGNORE NULLS) OVER (ORDER BY ROWNUM) AS lv
  FROM   mytable