PostgreSQL / Oracle =>查询分组和计算分层值

时间:2018-05-15 19:48:33

标签: sql oracle postgresql

我在PostgreSQL上有这个表,但我在Oracle DB上测试它。     我需要提取计数数据来检查开始和结束的次数     价值重演

CREATE TABLE MY_TABLE
(
  KEY    VARCHAR2(100 BYTE),
  ID     NUMBER,
  VALUE  VARCHAR2(2000 BYTE)
);

使用这些值:

INSERT INTO my_table VALUES ('Dia-001', 1, 'welcome');
INSERT INTO my_table VALUES ('Dia-002', 1, 'welcome');
INSERT INTO my_table VALUES ('Dia-002', 2, 'condizioni_app1');
INSERT INTO my_table VALUES ('Dia-002', 3, 'condizioni');
INSERT INTO my_table VALUES ('Dia-003', 1, 'welcome');
INSERT INTO my_table VALUES ('Dia-003', 2, 'condizioni_app1');
INSERT INTO my_table VALUES ('Dia-003', 3, 'condizioni_app2');

我想得到这个结果

VALUE             NEXT              COUNT
welcome           condizioni_app1   2
condizioni_app1   condizioni        1
condizioni_app1   condizioni_app2   1

注意:如果KEY字段中的值为单个,则不应对其进行计数 (例如,对于KEY' Dia-001') 必须计算所有值对。例如,关键' Dia-002'我们有 对welcome / condizioni_app1,condizioni_app1 / condizioni(id 1和2,2和 3)。

1 个答案:

答案 0 :(得分:1)

一个选项是Postgres'lead window function

select  value
,       next_value
,       count(*)
from    (
        select  value
        ,       lead(value) over (partition by key order by id) as next_value
        from    MY_TABLE
        ) sub
where   next_value is not null
group by
        value
,       next_value

或者您可以使用自联接来查找同一个键的下一个值:

select  t1.value
,       t2.value
,       count(*)
from    MY_TABLE t1
join    MY_TABLE t2
on      t1.KEY = t2.KEY
and     t1.ID = t2.ID - 1
group by
        t1.value
,       t2.value

Both examples at SQL Fiddle.