Можете да използвате COUNT( DISTINCT code) OVER (PARTITION BY id)
аналитична функция, за да получите своя отговор, като използвате само едно сканиране на таблица:
Настройка на схема на Oracle 11g R2 :
CREATE TABLE table_name ( ID, Code, "DATE" ) ASSELECT 1, 'A', DATE '2018-02-19' FROM DUAL UNION ALLSELECT 1, 'B', DATE '2018-02-18 ' ОТ DUAL UNION ALLSELECT 1, 'B', ДАТА '2018-02-17' ОТ DUAL UNION ALLSELECT 1, 'B', ДАТА '2018-02-16' ОТ DUAL UNION ALLSELECT 2, 'A', ДАТА '2018 -02-17' ОТ DUAL UNION ALLSELECT 2, 'B', ДАТА '2018-02-16' ОТ DUAL UNION ALLSELECT 3, 'A', ДАТА '2018-02-17' ОТ DUAL UNION ALLSELECT 3, 'A' , ДАТА '2018-02-16' ОТ DUAL UNION ALLSELECT 4, 'D', ДАТА '2018-02-16' ОТ DUAL;
Заявка 1 :
SELECT ID, Code, "DATE"FROM ( SELECT t.*, COUNT( DISTINCT code ) OVER ( PARTITION BY id ) AS num_changes FROM table_name t WHERE "DATE" BETWEEN DATE '2018-02-16' И ДАТА '2018-02-19') WHERE num_changes> 1
<предварителен код>| ID | КОД | ДАТА ||----|------|-----------------------|| 1 | A | 2018-02-19T00:00:00Z || 1 | B | 2018-02-18T00:00:00Z || 1 | B | 2018-02-17T00:00:00Z || 1 | B | 2018-02-16T00:00:00Z || 2 | A | 2018-02-17T00:00:00Z || 2 | B | 2018-02-16T00:00:00Z | Заявка 2 :
SELECT ID, Code, "DATE"FROM ( SELECT t.*, COUNT( DISTINCT code ) OVER ( PARTITION BY id ) AS num_changes FROM table_name t WHERE "DATE" BETWEEN DATE '2018-02-16' И ДАТА '2018-02-18') WHERE num_changes> 1
<предварителен код>| ID | КОД | ДАТА ||----|------|-----------------------|| 2 | A | 2018-02-17T00:00:00Z || 2 | B | 2018-02-16T00:00:00Z |