sql - PostgreSQL/Oracle => 查询以对层次值进行分组和计数

标签 sql oracle postgresql

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

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')。
必须计算所有成对的值。例如,对于 key “Dia-002”,我们有 对 welcome/condizioni_app1, condizioni_app1/condizioni (id 1 and 2, 2 and 3).

最佳答案

一个选项是 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.

关于sql - PostgreSQL/Oracle => 查询以对层次值进行分组和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50358139/

相关文章:

SQL查询帮助,条件连接

sql - VB.Net/Access SQL插入子查询问题

mysql - 如何忽略条件结果并在sql server中选择保留结果

java - Servlet 仅适用于一种 jsp 表单

postgresql 枚举时间

macos - 在 Mac 中通过网络访问 postgresql 服务器

postgresql - 需要给定时区的 Postgres 查询结果

sql - 将 SQL 插入脚本转换为 CSV 格式

java - 索引和分页

mysql - 有问题的归一化