2017-05-04 1 views
0

Ich muss eine Abfrage erstellen, die Datensätze basierend auf mehreren Maximalwerten in einer Gruppe in einer bestimmten Hierarchie ziehen wird. Ich habe eine Tabelle, die wie folgt aussieht:Erstellen einer Abfrage zum Auswählen eines Datensatzes basierend auf einer Hierarchie - PROC SQL

Key Classificaiton set_ind Date  Rank Amount 
1  1    1  5/2/2017 1  15 
2  1    1  5/2/2017 3  2 
3  1    0  4/2/2017 2  32 
4  2    1  5/1/2017 2  5 
5  2    1  1/5/2017 4  16 
6  2    1  12/13/2016 1  12 
7  2    0  12/13/2016 3  20 
8  3    1  4/5/2017 2  15 
9  3    0  4/8/2017 1  23 

ich für jeden Datensatz muss in die Lage zu bekommen den Schlüssel, der eine set_ind hat = 1, das jüngste Datum und den höchsten Rang in dieser Reihenfolge der Hierarchie für jede Klassifizierung.

So aus dem Probentisch, würde die Abfrage des Datensatzes entsprechend der Taste 2, ziehen Sie 4 und 8.

Ich habe versucht, diesen Code verwenden:

proc sql; 
    create table test as 
    select key, classification, max(date), max(rank) 
    from ods.data 
    where set_ind = 1 
    group by 2, 1; 
    quit; 

Ich weiß, ich bin immer noch Da ich den Schlüssel in der Abfrage habe, benötige ich den Schlüssel, um den spezifischen Datensatz identifizieren zu können.

Ich habe auch versucht, zwei Abfragen auszuführen, eine maximale (Datum) zu finden und dann eine richtige Verbindung zu einer anderen Abfrage zu finden, um max (Rang) zu finden, aber das hat auch nicht funktioniert.

Für beide Abfragen haben die Daten, die ich brauche keine Dups in der Spalte Klassifizierung und wird einen Schlüssel haben, um mit jedem Datensatz zu gehen. Wenn ich den oben genannten Code ausführe, bekomme ich einen Tipp. Ich bin mir nicht sicher, wie ich die Daten richtig ziehen soll.

+0

So für die Klassifizierung 2: Sie den Schlüssel als 4 gewählt basierend auf max (Datum) aber nicht den höchsten Rang haben. Sie wollen also das höchste Datum für jede Klassifizierung und ihren CORRESPONDING-Rang? –

+0

@ G.Arima Nicht ganz. Stellen Sie sich jede Klassifizierung als Set vor. Innerhalb jeder Klassifikation habe ich ein Datum. Ich mache eine Teilmenge des höchsten Datums aus jeder Klassifizierung. Wenn es mehrere Datensätze mit dem höchsten Datum gibt, wähle ich den höchsten Rang aus dieser Teilmenge der höchsten Daten für die Klassifikationen. Ich hoffe das ergibt Sinn. – Jarom

+0

Ja, es ist perfekt. Ich habe die Abfrage nur auf diese Logik beantwortet. :) –

Antwort

2

Da Sie SAS verwenden. Ihnen eine effiziente Möglichkeit zu geben, das Problem im Datenschritt zu lösen.
Schritt 1:Sortieren die Daten durch Klassifizierung, Datum Rang
Schritt 2: Wählen Sie letzte Datensatz jeder Klassifizierung von zuerst., um die maximalen Daten für jede Klassifizierung zu erhalten. In dem Fall sind die Daten gleich und dann wird der maximale Rang ausgewählt.

proc sort data =abc; 
by Classificaton Date rank; 
run; 

data abc1; 
set abc(where=(set_ind=1)); 
by Classificaton Date rank; 
if last.Classificaton ; 
drop amount set_ind; 
run;  

Meine Leistung:

|Key |Classificaton |Date  |Rank 
|2  |1    |5/2/2017 |3 
|4  |2    |5/1/2017 |2 
|8  |3    |4/5/2017 |2 

mich bei allen Fragen wissen lassen.

+0

Arbeitete ohne ein Problem, danke! Ich habe gerade einen Weg gefunden, es mit proc sql zu machen, also poste ich das als Referenz, aber das ist ein viel besserer Weg, es in SAS zu lösen. – Jarom

+0

Wir freuen uns auf diese SQL-Lösung. Bitte schön. Freue mich zu helfen :) –

2

Unterabfragen wie diese lassen mich zögern, diese Antwort zu posten, aber es wird für Sie arbeiten. Ich bin wirklich daran interessiert, eine bessere Antwort zu sehen, obwohl!

Edit: Ich habe Gehirn Furz hatte, und kopiert und meine Testabfrage, ohne es mit Ihrem Tisch Schema zu ersetzen. Ich habe die Abfrage mit den entsprechenden Tabellen-/Spaltennamen korrigiert.

0

Ich habe einen Weg gefunden, dieses Problem mit Hilfe von proc sql zu lösen, obwohl eine bessere Lösung für SAS vorgestellt wurde.

Ich habe zunächst eine Tabelle, die die Max-Werte für Datum und Rang zieht, hat aber doppelte Einstufungen:

proc sql; 
create table max_info as 
select classification 
     ,max(date) as date 
     ,max(rank) as rank 
from ods.data 
where set_ind = 1 
group by 1; 
quit; 

dann gehe ich auf die ursprüngliche Tabelle und die Datensätze, die Klassifizierung, max Datum entsprechen und max Rang mit diesem Code:

proc sql; 
create table max as 
select * 
from ods.data a 
right join work.max_info b on a.classification = b.classification and 
           a.date = b.date and 
           a.rank = b.rank 
where set_ind = 1; 
quit; 
0

Kein Datenbanktyp erwähnt.

In Vertica (und ich denke auch Postgres), können Sie es tun, wie unten. Sie unterstützen die LIMIT-Klausel mit OLAP-Fenster Ausdruck:

WITH 
-- input as from question, don't use in real query ... 
input(Key,classification,set_ind,Date,Rank,Amount) AS (
      SELECT 1,1,1,DATE '5/2/2017' ,1,15 
UNION ALL SELECT 2,1,1,DATE '5/2/2017' ,3,2 
UNION ALL SELECT 3,1,0,DATE '4/2/2017' ,2,32 
UNION ALL SELECT 4,2,1,DATE '5/1/2017' ,2,5 
UNION ALL SELECT 5,2,1,DATE '1/5/2017' ,4,16 
UNION ALL SELECT 6,2,1,DATE '12/13/2016',1,12 
UNION ALL SELECT 7,2,0,DATE '12/13/2016',3,20 
UNION ALL SELECT 8,3,1,DATE '4/5/2017' ,2,15 
UNION ALL SELECT 9,3,0,DATE '4/8/2017' ,1,23 
) 
-- end of input, real query starts here 
SELECT 
    * 
FROM input 
WHERE set_ind=1 
LIMIT 1 OVER(PARTITION BY classification ORDER BY date DESC, rank DESC) 
; 

Key|classification|set_ind|Date  |Rank|Amount 
    2|    1|  1|2017-05-02| 3|  2 
    4|    2|  1|2017-05-01| 2|  5 
    8|    3|  1|2017-04-05| 2| 15 
Verwandte Themen