sql >> Databasteknik >  >> RDS >> Oracle

Kombinationer från en enda tabell, grupperade efter ett kolumnvärde

Du kan göra detta med hierarkiska frågor - här är en som använder den gamla stilen 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

Den prior sys_guid() is not null villkoret i connect by-satsen krävs för att säkerställa att vi går över rätt rader (om du skulle utelämna det skulle resultatet innehålla många extra rader).

Jag har uteslutit rader med bara ett enda tillstånd i utgången - förutom om id:t bara listade ett enda tillstånd. Du kanske vill eller kanske inte vill inkludera enstaka tillstånd i utdata, i så fall kan du ta bort predikaten helt.




  1. Visa alla datum mellan, även om inget resultat

  2. Barman Cloud – Del 2:Cloud Backup

  3. Hur ställer jag in en standard standardbild (no_pic.gif) php?

  4. Hur man korrekt anropar PostgreSQL-funktioner (lagrade procedurer) inom Spring/Hibernate/JPA?