sql >> Databasteknik >  >> RDS >> Oracle

Välj rader när kolumnvärdet ändras mellan datum i Oracle?

Du kan använda COUNT( DISTINCT code ) OVER ( PARTITION BY id ) analytisk funktion för att få ditt svar med endast en tabellskanning:

SQL Fiddle

Oracle 11g R2 Schema Setup :

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;

Fråga 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

Resultat :

| 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 |

Fråga 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

Resultat :

| ID | CODE |                 DATE |
|----|------|----------------------|
|  2 |    A | 2018-02-17T00:00:00Z |
|  2 |    B | 2018-02-16T00:00:00Z |


  1. Laravel validerar unikt om id är detsamma

  2. JDBC returnerar fel antal berörda rader

  3. postgresql port confusion 5433 eller 5432?

  4. RAILS:Hur man frågar efter alla objekt vars varje association har ett attribut som inte är null