2016-06-03 14 views
-1

Ich habe eine Tabelle mit Struktur wie folgt:Erste Daten basierend auf Priorität

enter image description here

Spalte ‚Typ‘ hat drei Arten von Werten, die 1,2 und 3 ist

Jeder Typ hat bestimmte Regel (in der Spalte REGEL erwähnt) Die gleiche Regel kann mehreren Typeneinträgen zugeordnet werden. Jetzt möchte ich nur die Datensätze als Ausgabe, die einen höheren Wert hat. Zum Beispiel: "Bankentyp" ist eine Regel, die mit Typ 1,2 und 3 verknüpft ist. Daher wählen wir die Regel mit Wert mit Typ 3 aus, also Single. 'Komplexität' ist mit Typ 1 & 2, also werden wir die Regel Wert 5 wählen. Wenn eine Regel in nur einem Typ vorhanden ist, dann wird es wie es ist ausgewählt.

Ich habe versucht, folgende Abfrage aber es funktioniert mit Typ 1 & 2.

select * 
FROM CX_ROSTER_RULES_VIEW v 
INNER JOIN 
(
select RULE, MAX("Type") AS MAX_TYPE 
FROM CX_ROSTER_RULES_VIEW 
GROUP BY RULE 
) v1 
ON v.RULE = v1.RULE 
AND v."Type" = v1.MAX_TYPE 
WHERE (branch = 'Civil' AND category = 'C.M. (Civil)' AND sub_category = 'Pauper')   
     OR (branch = 'Civil' AND category = 'C.M. (Civil)' AND sub_category IS NULL) 
     OR (branch = 'Civil' AND category IS NULL AND sub_category IS NULL) 
+0

Mögliche Duplikat [SQL Query spezifische Kinder Aufzeichnungen bekommen] (http://stackoverflow.com/questions/37571301/sql-query-to-get-specific-child-records) – MT0

+0

Bitte nicht die gleiche Frage zweimal - Sie können Ihre bestehende Frage bearbeiten. – MT0

+0

Es ist anders. Zurück ist von zwei Tabellen. Es ist aus einer einzigen Sicht. – Bill

Antwort

0

ich würde dies tun.

(select rule, max(type) as type from yourtable 
group by rule) --this will give you the rule with the highest priority 

mit, dass dies tun

select m.* from CX_ROSTER_RULES_VIEW as m inner join (select rule, max(type) as type from CX_ROSTER_RULES_VIEW 
    group by rule) p on m.rule = p.rule and m.type = p.type 

auf dieser Maschine nicht SQL-, wenn die darüber nicht funktionieren versuchen. Ich werde morgen testen können, wenn Sie es nicht abgeschlossen haben.

select m.* from (select rule, max(type) as type from CX_ROSTER_RULES_VIEW 
      group by rule) as p left join CX_ROSTER_RULES_VIEW as m on p.rule = m.rule and p.type = m.type 

es das gleiche ziemlich ist, wollen einfach nur, um zu sehen, ob ein LEFT JOIN wird anders nichts tun.

+0

Abfrage gibt nicht korrekte Ergebnisse: Haupt select * von CX_ROSTER_RULES_VIEW Haupt innere Verknüpfung (wählen Regel max ("Type") als Typ von CX_ROSTER_RULES_VIEW Gruppe von Regel) Priorität auf main.rule = Priorität.. Regel und Haupt. "Typ" = Priorität.Typ – Bill

+0

Was ist die Dups? – chungtinhlakho

+0

Sorry, ich vergesse, Wo-Klausel zu setzen. Mit where-Klausel erhalte ich das gleiche Ergebnis wie meine gepostete Abfrage. – Bill

0

Versuchen Sie folgendes:

select v.* from 
CX_ROSTER_RULES_VIEW v join 
(select rule, max(type) as maxType from CX_ROSTER_RULES_VIEW group by rule) M 
on v.Rule = M.Rule and v.type = M.maxType 
+0

select v. * Aus CX_ROSTER_RULES_VIEW v, (Regel auswählen, max ("Type") als MaxType aus CX_ROSTER_RULES_VIEW Gruppe von Regel) M wo v.Rule = M.Rule und v. "Type" = M.maxType UND ((branch = 'Civil' UND category = 'CM (Civil)' UND sub_category = 'Pauper') ODER (branch = 'Civil' UND category = 'CM (Civil)' UND sub_category IS NULL) \t \t ODER (Branch = 'Civil' AND Kategorie IS NULL UND Unterkategorie IS NULL)) Regel "Day Rules" fehlt in der Ausgabe. – Bill

+0

Die Abfrage, die Sie eingefügt haben, unterscheidet sich von meiner. Gibt meine Anfrage eine mehr oder weniger korrekte Antwort? Ich schätze, du willst es weiter filtern. Wenn dies der Fall ist, versuchen Sie, die gesamte Abfrage in eine Klammer einzufügen. – Ash

+0

Bitte verwenden Sie nicht die Legacy-Komma-Joinsyntax. Die ANSI-Joinsyntax ist viel übersichtlicher (besonders wenn Sie Outer-Joins durchführen möchten). – MT0

1

Verwenden Sie die ROW_NUMBER() analytische Funktion dann werden Sie nicht ein Self-Join tun müssen:

SELECT * 
FROM (
    SELECT v.*, 
     ROW_NUMBER() OVER (PARTITION BY Rule ORDER BY "Type" DESC) AS rn 
    FROM CX_ROSTER_RULES_VIEW v 
    WHERE branch = 'Civil' 
    AND ( category IS NULL 
     OR (category = 'C.M. (Civil)' 
      AND (sub_category IS NULL OR sub_category = 'Pauper') 
      ) 
     ) 
) 
WHERE rn = 1; 
+0

Es gibt korrekte Ausgabe. Aber es ist möglich, eine einzige WHERE-Klausel in der gesamten Abfrage zu haben? – Bill

+0

@Bill Warum? Abgesehen von ästhetischen Gründen gibt es keinen Vorteil, wenn mehrere "WHERE" -Klauseln in Inline-Ansichten verschachtelt sind. Außerdem wird es wahrscheinlich die Abfrage unterbrechen, da Sie nach der Verzweigung/Kategorie/Unterkategorie filtern müssen, bevor Sie die 'ROW_NUMBER()' generieren und dann danach filtern. Sie könnten versuchen, ROW_NUMBER() OVER (Partition durch Regel, Branch ORDER BY "Typ" DESC) AS rn' und dann verschieben die 'WHERE'-Klausel aus dem inneren in den äußeren Select-Block, aber ich denke, dass es unbeabsichtigte Nebenwirkungen haben kann und weniger leistungsfähig sein. – MT0

Verwandte Themen