आप COUNT( DISTINCT code ) OVER ( PARTITION BY id )
का उपयोग कर सकते हैं केवल एक टेबल स्कैन का उपयोग करके अपना उत्तर प्राप्त करने के लिए विश्लेषणात्मक कार्य:
Oracle 11g R2 स्कीमा सेटअप :
CREATE TABLE table_name ( ID, Code, "DATE" ) AS
SELECT 1, 'A', DATE '2018-02-19' FROM DUAL UNION ALL
SELECT 1, 'B', DATE '2018-02-18' FROM DUAL UNION ALL
SELECT 1, 'B', DATE '2018-02-17' FROM DUAL UNION ALL
SELECT 1, 'B', DATE '2018-02-16' FROM DUAL UNION ALL
SELECT 2, 'A', DATE '2018-02-17' FROM DUAL UNION ALL
SELECT 2, 'B', DATE '2018-02-16' FROM DUAL UNION ALL
SELECT 3, 'A', DATE '2018-02-17' FROM DUAL UNION ALL
SELECT 3, 'A', DATE '2018-02-16' FROM DUAL UNION ALL
SELECT 4, 'D', DATE '2018-02-16' FROM 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'
AND DATE '2018-02-19'
)
WHERE num_changes > 1
परिणाम :
| ID | CODE | DATE |
|----|------|----------------------|
| 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'
AND DATE '2018-02-18'
)
WHERE num_changes > 1
परिणाम :
| ID | CODE | DATE |
|----|------|----------------------|
| 2 | A | 2018-02-17T00:00:00Z |
| 2 | B | 2018-02-16T00:00:00Z |