2017-06-07 4 views
0

Ich versuche, verschiedene Pfade durch mehrere Kategorien zu verfolgen. Eine vereinfachte Ansicht meiner Tabelle sieht wie folgt aus:SQL Server row_number() über Partition von, aber ich ignoriere kategorische Werte zu wiederholen

Table: customer_category 

CustomerID | Category | Date 
11111  | A   | 2016-01-01 
11111  | B   | 2016-02-01 
11111  | C   | 2016-03-01 
22222  | A   | 2016-01-01 
22222  | A   | 2016-02-01 
22222  | A   | 2016-03-01 
22222  | C   | 2016-04-01 
33333  | A   | 2016-01-01 
33333  | B   | 2016-02-01 
33333  | C   | 2016-03-01 
33333  | C   | 2016-04-01 

ich die absoluten Pfade mithilfe dieser Abfrage finden:

with cat_order as (
    select CustomerID 
      ,Category 
      ,row_number() over (partition by CustomerID order by Date) as rnk 
    from customer_category 
),pivot as (
    select CustomerID 
     ,max(case when rnk = 1 then Category else null end) as category_1 
     ,max(case when rnk = 2 then Category else null end) as category_2 
     ,max(case when rnk = 3 then Category else null end) as category_3 
     ,max(case when rnk = 4 then Category else null end) as category_4 
    from cat_order 
    group by CustomerID 
) 
select category_1, category_2, category_3, category_4, count(*) as count 
from pivot 
group by category_1, category_2, category_3, category_4 

;

Das gibt mir folgende:

category_1 | category_2 | category_3 | category_4 | count 
A   | B   | C   |    | 1 
A   | A   | A   | C   | 1 
A   | B   | C   | C   | 1 

Was ich, obwohl will, wiederholten Kategorien ist, zu ignorieren, so dass ich

category_1 | category_2 | category_3 | category_4 | count 
A   | B   | C   |    | 2 
A   | C   |    |    | 1 

In meinem Kopf sehen würde, ich glaube, ich müsste zu

  1. auslassen jeden Datensatz, in der Kategorie = Verzögerung (Kategorie)
  2. Rang über Partition ...
  3. Dreh mit case-Anweisungen
  4. aggregieren die Ergebnisse

Es fühlt sich an Art und Weise kompliziert. Gibt es einen einfacheren Weg, dies zu tun?

+0

was meinst du ignorieren wiederholte kategorie .. alle 1,2,3,4? In deinem Ergebnis hast du ein c aus Kategorie2, aber die Basis hat es nicht. –

+0

Wenn ich "wiederholte Kategorie" sage, schaue ich mir an, wie Verbraucher 22222 eine Sequenz AAA C durchläuft. Es ist mir egal, dass sie in drei verschiedenen Messungen in Kategorie A waren, nur dass sie ein A und dann ein C waren (ohne durch Kategorie B zu gehen), während die anderen beiden einer Progression von A -> B -> C folgten –

Antwort

0

Es gibt keine einfachere Möglichkeit, dies zu tun, soweit ich das beurteilen kann (angesichts Ihrer Daten und Ihrer gewünschten Ausgabe). Um die gewünschten Ergebnisse zu erzielen, müssen Sie grundsätzlich die vier Schritte ausführen, die Sie skizziert haben (oder eine Variation davon). Sie können es so "vereinfachen", dass es keine CTEs benötigt. Zum Beispiel:

SELECT category_1 = P.[1], 
     category_2 = P.[2], 
     category_3 = P.[3], 
     category_4 = P.[4], 
     [Count] = COUNT(*) 
FROM 
(
    SELECT CustomerID, 
      Category, 
      rnk = SUM(checkprev) OVER (PARTITION BY CustomerID ORDER BY [Date]) 
    FROM 
    (
     SELECT *, checkprev = CASE WHEN LAG(Category) OVER (PARTITION BY CustomerID ORDER BY [Date]) = Category THEN 0 ELSE 1 END 
     FROM customer_category 
    ) T 
) AS T 
PIVOT 
(
    MAX(Category) FOR rnk IN ([1], [2], [3], [4]) 
) AS P 
GROUP BY P.[1], P.[2], P.[3], P.[4]; 
Verwandte Themen