partition über zwei Spalten

Ich bin zu wollen, um die partition um zwei Spalten (PROJECT_ID, UND CATEGORY_NAME) und ich habe Probleme beim schreiben der korrekten syntax. Meine Anfrage unten ist funktional, aber wenn ich versuche, fügen Sie eine zusätzliche over-Klausel funktioniert es nicht richtig. Die rekursive Abfrage wurde zum verketten von Zeilen Partitionierung über project_id, die Erstellung einer Liste von admins kombinieren und verketten name_last und name_first machen Sie eine Liste. Ich brauche eine zusätzliche over-Klausel enthalten, die CATEGORY_NAME durch admins in der Liste, die Arbeit in den verschiedenen Kategorien ('INVISION' UND 'INSIGHT') aber sind unter den gleichen project_id. Die erste Unterabfrage

SELECT 
        RowNumber() over (PARTITION BY F13.DIM_PROJECT_ID, F13.CATEGORY_NAME ORDER BY F13.PROJECT_NAME),      
        F13.DIM_PROJECT_ID.....etc.

extrahiert die richtigen Daten, ich bin nur nicht sicher, wie zu ziehen, dass die richtigen Daten Partitionierung durch Projekt und Kategorie. Ich bin mit db2.

with

   t1(rowNum, PROJECT_ID, NAME_LAST, NAME_FIRST, POINT_OF_CONTACT, PROJECT_NAME, BUSINESS_NAME) as 

   (
      SELECT 
        RowNumber() over (PARTITION BY F13.DIM_PROJECT_ID, F13.CATEGORY_NAME ORDER BY F13.PROJECT_NAME),      
        F13.DIM_PROJECT_ID,
        F2P.NAME_LAST,
        F2P.NAME_FIRST, 
        REPLACE(F2P.POINT_OF_CONTACT, ',', ' |') AS POINT_OF_CONTACT,
        F13.PROJECT_NAME,
        F2H.CATEGORY_NAME,

FROM FACT_TABLE AS F13
INNER JOIN ADMIN AS F2P ON F13.DIM_PROJECT_ID = F2P.DIM_PROJECT_ID
LEFT JOIN HOURS AS F2H ON F13.DIM_PROJECT_ID = F2H.DIM_PROJECT_ID
WHERE F2H.CATEGORY_NAME = ('INVISION')




group by  
        F13.DIM_PROJECT_ID,
        F13.PROJECT_NAME,
        F2P.NAME_LAST,
        F2P.NAME_FIRST, 
        F2P.POINT_OF_CONTACT,
        F2H.CATEGORY_NAME
 ) ,

       t2(PROJECT_ID, LIST, POINT_OF_CONTACT, PROJECT_NAME, BUSINESS_NAME, cnt) AS
    ( SELECT    PROJECT_ID, 
                VARCHAR(NAME_FIRST CONCAT ' ' CONCAT NAME_LAST, 6000),
                POINT_OF_CONTACT, 
                PROJECT_NAME, 
                CATEGORY_NAME,
                1
    FROM t1
            WHERE rowNum = 1
            UNION ALL
    SELECT      t2.PROJECT_ID,
                t2.list || ' | ' || t1.NAME_FIRST CONCAT ' ' CONCAT t1.NAME_LAST, 
                t1.POINT_OF_CONTACT,
                t1.PROJECT_NAME, 
                t1.CATEGORY_NAME
    FROM t2, t1 
            WHERE t2.project_id = t1.project_id 
            AND   t2.cnt + 1 = t1.rowNum )    
    SELECT      PROJECT_ID, 
                PROJECT_NAME, 
                POINT_OF_CONTACT,
                CATEGORY_NAME
                list
    FROM t2
            WHERE ( PROJECT_ID, cnt ) IN (
    SELECT PROJECT_ID, MAX(rowNum)
    FROM t1
            GROUP BY PROJECT_ID )    

Die Ergebnisse, die ich bekommen hab sind die Herstellung von Duplikaten, aber nur, wenn die zweite Spalte (category_name ist in der partition-Klausel. Die aktuellen Ergebnisse:
partition über zwei Spalten

Gewünschten Ergebnisse:

partition über zwei Spalten

  • Versuchst du 2 verschiedene Sätze von Zeile zahlen, ein zählen, basierend auf den einzelnen dim_project_id, und einen zweiten Satz von Zeilennummern für jede category_name? Es auch generell nützlich ist, zeigen einige Beispiel-Daten und die erwarteten Ergebnisse...
  • Zunächst war das mein Ansatz, aber ich wusste nicht, mehrere Spalten unterstützt wurden, indem Sie die partition-Klausel. Ich änderte meine Frage oben zu reflektieren, die änderung, die ich gemacht. Jetzt bin ich immer doppelte Ergebnisse. Werde ich legen Sie eine Probe und erwarteten Ergebnisse.
InformationsquelleAutor Tone | 2013-09-16
Schreibe einen Kommentar