sql - 有重复组时选择最后一组的第一条记录

标签 sql oracle group-by

尝试为每个 POLICY_ID 选择最新重复 STATUS 组的第一条记录。我怎样才能做到这一点?

编辑/注意:如最后三行所示,可以有两个以上的状态重复。

查看数据:

enter image description here

期望的输出:

enter image description here

数据的 SQL:

--drop table mytable;
create table mytable (ROW_ID Number(5), POLICY_ID Number(5), 
                      CHANGE_NO Number(5), STATUS VARCHAR(50), CHANGE_DATE DATE);

insert into mytable values (  81, 1, 1, 'A', date '2018-01-01');
insert into mytable values (  95, 1, 2, 'A', date '2018-01-02');
insert into mytable values ( 100, 1, 3, 'B', date '2018-01-03');
insert into mytable values ( 150, 1, 4, 'C', date '2018-01-04');
insert into mytable values ( 165, 1, 5, 'A', date '2018-01-05');
insert into mytable values ( 175, 1, 6, 'A', date '2018-01-06');
insert into mytable values ( 599, 2, 1, 'S', date '2018-01-11');
insert into mytable values ( 602, 2, 2, 'S', date '2018-01-12');
insert into mytable values ( 611, 2, 3, 'S', date '2018-01-13');
insert into mytable values ( 629, 2, 4, 'T', date '2018-01-14');
insert into mytable values ( 720, 2, 5, 'U', date '2018-01-15');
insert into mytable values ( 790, 2, 6, 'S', date '2018-01-16');
insert into mytable values ( 812, 2, 7, 'S', date '2018-01-17');
insert into mytable values ( 825, 2, 8, 'S', date '2018-01-18');

select * from mytable;

最佳答案

嗯。 . .

select t.*
from (select t.*,
             row_number() over (partition by policy_id order by change_date asc) as seqnum
      from t
      where not exists (select 1
                        from t t2
                        where t2.policy_id = t.policy_id and
                              t2.status <> t.status and
                              t2.change_date > t.change_date
                       )
     ) t
where seqnum = 1;

内部子查询查找所有行——对于给定的策略编号——没有具有不同状态的后续行。这定义了最后一组记录。

然后它使用 row_number()枚举行。这些外部查询为每个 policy_number 选择第一行.

关于sql - 有重复组时选择最后一组的第一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53925297/

相关文章:

php - 使用 PHP 通过 sqlsrv 驱动程序在 sql server 中插入当前日期时间

sql-server - SSIS - 由于可能会丢失数据,因此无法转换该值

xml - 如何重命名 Oracle XMLTYPE 节点

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

sql - 如何获取通过 ODP.NET 中的 OracleParameter 传递的绑定(bind)变量的跟踪信息?

sql - 如何在现有模式中查找 Informix DATETIME 字段限定符

mysql - 如何编写动态 mysql 历史触发器

oracle - 在Oracle中,我们如何在dbms_aq.dequeue中有条件地使数据出队

SQL - 特定分组依据

sql - 如何在单个 SELECT 查询中获取用户今天和本月的事件计数