Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Kombinacje z pojedynczej tabeli pogrupowane według wartości kolumny

Możesz to zrobić za pomocą zapytań hierarchicznych — tutaj jest jedno używające starego stylu connect by :

WITH your_table AS (SELECT 1 ID, 'AL' state FROM dual UNION ALL
                    SELECT 1 ID, 'AZ' state FROM dual UNION ALL
                    SELECT 1 ID, 'MI' state FROM dual UNION ALL
                    SELECT 2 ID, 'TX' state FROM dual UNION ALL
                    SELECT 2 ID, 'TN' state FROM dual UNION ALL
                    SELECT 2 ID, 'MO' state FROM dual UNION ALL
                    SELECT 2 ID, 'ND' state FROM dual UNION ALL
                    SELECT 3 ID, 'OH' state FROM dual)
SELECT ID,
       state,
       ltrim(SYS_CONNECT_BY_PATH(state, ','), ',') combinations,
       LEVEL
FROM   (SELECT id,
               state,
               count(*) OVER (PARTITION BY id) state_cnt
        FROM your_table)
WHERE  state_cnt = 1
OR     (state_cnt > 1 AND LEVEL > 1)
CONNECT BY PRIOR ID = ID
           AND PRIOR state < state
           AND PRIOR sys_guid() IS NOT NULL;

        ID STATE COMBINATIONS      LEVEL
---------- ----- ------------ ----------
         1 AZ    AL,AZ                 2
         1 MI    AL,AZ,MI              3
         1 MI    AL,MI                 2
         1 MI    AZ,MI                 2
         2 TX    TN,TX                 2
         2 TX    MO,TX                 2
         2 TN    MO,TN                 2
         2 TX    MO,TN,TX              3
         2 ND    MO,ND                 2
         2 TX    MO,ND,TX              3
         2 TN    MO,ND,TN              3
         2 TX    MO,ND,TN,TX           4
         2 TX    ND,TX                 2
         2 TN    ND,TN                 2
         2 TX    ND,TN,TX              3
         3 OH    OH                    1

prior sys_guid() is not null warunek w klauzuli connect by jest wymagany, aby zapewnić, że zapętlamy właściwe wiersze (gdyby go pominąć, wynik zawierałby wiele dodatkowych wierszy).

Wykluczyłem wiersze z tylko jednym stanem na wyjściu - z wyjątkiem sytuacji, gdy identyfikator wyświetla tylko jeden stan. Możesz lub nie chcieć uwzględniać pojedynczych stanów w danych wyjściowych, w takim przypadku możesz całkowicie usunąć predykaty.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sekwencja Wyroczni zaczynająca się od 2 zamiast 1

  2. Nie można wyodrębnić wartości XML z Oracle CBLOB

  3. Dlaczego otrzymuję numer ORA-01722 (nieprawidłowy numer)?

  4. Oracle — Transpozycja wierszy na kolumny

  5. Dane zapytania Oracle, w których wartość kolumny z przecinkiem do sprawdzenia wartości zawiera lub nie zawiera