2017-12-12 12 views
1

Ich versuche meine Daten basierend auf der Existenz von Text innerhalb einer Variablen für jede ID zu kategorisieren, die ich habe. Zum Beispiel:Fallanweisung basierend auf der Partitionierung von Daten

ID Groupname 
1 A 
1 B 
1 F 
2 D 
2 B 
2 C 

Das Ergebnis Ich möchte

sein
ID Groupname Category 
1 A   AF 
1 B   AF 
1 F   AF 
2 D   D 
2 B   D 
2 C   D 

ich etwas wie das folgende tun wollen, aber ich kann es nicht

Select * , 
CASE WHEN A,F in groupname (partition by id) THEN AF 
    WHEN D in groupname (partition by id) THEN D 
     .... 
    ELSE null END 
FROM table 

Antworten in Postgres/Rotverschiebung arbeiten würde sehr geschätzt werden!

EDIT:

Ich reparierte das Problem mit F dass JNevill gebracht.

EDIT2:

Ein Nutzer vorgeschlagen, eine einfache Lösung, die funktioniert, wenn Sie nur 1 Kombination benötigen. Z.B. Wenn ich F oder A sehe, dann ist es AF. Aber wenn ich A und F sehen muss, wird es nicht funktionieren. Hier

ist die einfache Lösung:

WENN sum (CASE WHEN Combo in (20,28,19,27), dann 1 Ende) über (Partition durch log_id) = 1 dann 1000

Wenn i Ich möchte folgendes tun, was sehr langen Code erzeugt. Gibt es einen einfacheren Weg dies zu tun?

WENN sum (CASE WHEN Combo in (20,28,19,27), dann 1 Ende) über (Partition durch log_id) = 1 und sum (CASE WHEN groupid in (1048,598,428), dann 1 Ende) über (Partition von log_id) = 1 dann 1000

+0

Sie haben in Ihren Beispieldaten nicht 'F' als' GROUPNAME'. Warum sollte "B" den Wert "AF" aufnehmen? Was wäre, wenn 'ID'' 2' ein A und ein F hätte? Würde es ein "D" oder ein "AF" bekommen oder gäbe es neue Datensätze für "2", um eine solche Situation zu bewältigen? – JNevill

Antwort

0

Sie Fall mit der Partitionierung Recht haben, es erfordert nur bedingt Aggregat

select 
* 
,case 
    when sum(case when groupname in ('A','F') then 1 end) over (partition by id)=1 then 'AF' 
    when sum(case when groupname in ('D') then 1 end) over (partition by id)=1 then 'D' 
end as category 
from t 

einen Hinweis ist, dass, wenn Sie nur das Paar A und F machen AF-Kategorie ist es nicht mit dieser Syntax möglich ... count(distinct case...) over() gibt einen Fehler und erfordert komplexere Abfrage, aber von dem, was ich sehe, don 'nicht t brauchen Sie es, da F nicht in Ihren Beispieldaten enthalten ist

+0

Hey, danke dafür, ich habe das Problem mit F behoben, dass du und JNevill angesprochen hast. Wie würden Sie dann Kombinationen machen? Ich habe den folgenden Code, aber es ist so lang und unordentlich und wir müssen eine massive Abfrage erstellen, um eine Menge Daten zu kategorisieren, und ich würde es vorziehen, saubereren Code zu verwenden. Hier ist, woran ich arbeite. Ich nur ein und eine Aussage, was Sie getan haben. Gibt es einen saubereren Weg, dies zu tun? WENN Summe (CASE WHEN Combo in (20,28,19,27) dann 1 Ende) über (Partition von log_id) = 1 und Summe (CASE WHEN Groupid in (1048,598,428) dann 1 Ende) über (Partition von log_id) = 1 dann 1000 –