sql >> Database teknologi >  >> RDS >> Oracle

Kombinationer fra en enkelt tabel, grupperet efter en kolonneværdi

Du kan gøre dette ved at bruge hierarkiske forespørgsler - her er en, der bruger den gamle stil 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 betingelse i connect by-klausulen er påkrævet for at sikre, at vi går over de korrekte rækker (hvis du udelade det, ville resultatet indeholde mange ekstra rækker).

Jeg har udelukket rækker med kun en enkelt tilstand i outputtet - undtagen hvis id'et kun angav en enkelt tilstand. Du ønsker måske at inkludere enkelte tilstande i outputtet, og i så fald kan du fjerne prædikaterne helt.




  1. Hvad betyder nøgleordet KEY?

  2. Opret en funktion med valgfri argumenter i MySQL

  3. Hvordan ændrer jeg kolonnens standardværdi i PostgreSQL?

  4. Brug af UNNEST med en JOIN