sql >> Database >  >> RDS >> Oracle

Combinaties uit een enkele tabel, gegroepeerd op een kolomwaarde

U kunt dit doen met behulp van hiërarchische zoekopdrachten - hier is er een met de ouderwetse 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

De prior sys_guid() is not null voorwaarde in de connect by-clausule is vereist om ervoor te zorgen dat we over de juiste rijen lopen (als u deze zou weglaten, zou het resultaat veel extra rijen bevatten).

Ik heb rijen uitgesloten met slechts een enkele staat in de uitvoer - behalve als de id slechts een enkele staat vermeldde. U kunt al dan niet afzonderlijke toestanden in de uitvoer opnemen, in welk geval u de predikaten volledig kunt verwijderen.




  1. beste tutorial voor het gebruik van het entiteitsframework, POCO en MySQL

  2. MySQL gebruikt geen indexen bij het opvragen van een BIT-veld met behulp van bitsgewijze functies

  3. tel aantal actieve dagen formulier database

  4. Opgeslagen niet-Engelse karakters, heb '?????' - Probleem met MySQL-tekenset