2016-04-22 11 views
3

Ich habe diese Tabelle nach unten:Oracle SQL Rang

[Table A][1] 

B_NUMBER_COUNTRY OUTGOING_CARRIER MINUTES 
CAN     A     1,045.71 
CAN     B      7.98 
CAN     C     973.52 
FRA     A     566.19 
FRA     B     521.52 
FRA     C      27.03 
FRA     D     549.14 
FRA     E      0.21 
USA     A      32.57 
USA     B     303.17 
USA     C     9,837.53 
USA     D      3.91 
USA     E      0.07 
USA     F     2,469.00 
USA     G      67.68 
USA     H      0.37 
USA     I     933.72 

Ich brauche b_number_country Rang bezogen auf die Summe von Minuten.

In dem obigen Fall beträgt die Gesamtminuten für USA 13K, CAN ist 2K und FRA ist 1,6K. So sollte das Ranking USA sein - 1, CAN - 2 und FRA - 3. Durch das Hinzufügen des Rang Spalt, soll es nach unten zeigen,:

[Table A (rank)][2] 

B_NUMBER_COUNTRY OUTGOING_CARRIER MINUTES RANK 
CAN     A     1,045.71 2 
CAN     B      7.98 2 
CAN     C     973.52 2 
FRA     A     566.19 3 
FRA     B     521.52 3 
FRA     C      27.03 3 
FRA     D     549.14 3 
FRA     E      0.21 3 
USA     A      32.57 1 
USA     B     303.17 1 
USA     C     9,837.53 1 
USA     D      3.91 1 
USA     E      0.07 1 
USA     F     2,469.00 1 
USA     G      67.68 1 
USA     H      0.37 1 
USA     I     933.72 1 

Ich bin nicht in der Lage die richtige Abfrage zu bekommen, dies zu tun. Jeder Versuch, es beinhaltet sowohl b_number_country als auch outgoing_carrier als Teil des Rankings.

+0

den Code Kommentar über DENSE_RANK in dnoeth Antwort- Um zu klären, und Gordon Kommentar zu dieser Antwort: Was willst du für "Rank" anzeigen, wenn es Krawatten gibt? Angenommen, die USA und Frankreich sind an erster Stelle gebunden; Willst du, dass beide Rang 1 und Kanada 3 zeigen? Oder willst du USA = 1, Frankreich = 1, Kanada = 2? Oder vielleicht (obwohl weniger wahrscheinlich), wählte einen der USA und Frankreich zu 1, der andere zu 2, und Kanada zu 3? Die Auswahl für 1 und 2 ist zufällig oder basiert auf einer sekundären Sortierung (z. B. alphabetisch oder nach Anzahl der Träger usw.). – mathguy

Antwort

3

Edited basierend auf Kommentar:

Sie benötigen zwei Schritte, zuerst die Summe der Minuten berechnen und dann Rang:

SELECT ..., 
    DENSE_RANK() 
    OVER (ORDER BY sumMinutes DESC) -- must be DENSE_RANK 
FROM 
(
    SELECT b_number_country, interval_of_day, outgoing_carrier, 
     SUM (call_duration)/60 AS Minutes, 
     SUM (call_count) AS attempt, 
     SUM (answered_count) AS answered, 
     SUM (seizure_count) AS seizure, 
     SUM(start_call_count) AS Count_X, 
     SUM(ner_count) AS NER_COUNT, 
     SUM(SUM (call_duration)/60) 
     OVER (PARTITION BY B_NUMBER_COUNTRY) AS sumMinutes 
    FROM bm_archived_cdr 
    WHERE call_direction = 'O' 
    AND call_date = DATE '2016-04-21' 
    GROUP BY b_number_country, interval_of_day, outgoing_carrier 
) dt;  
+0

Wenn das OP für Länder, die die gleiche Summe haben, einen separaten Rang haben möchte, würde er "b_number_country" in der äußeren Reihenfolge in die "Reihenfolge von" einschließen. –

+0

hi ... schätze das Feedback bis jetzt. Ich habe das Obige in meine eigentliche Anfrage eingebunden und bisher kein Glück. – deven2020

+0

SELECT b_number_country, interval_of_day, outgoing_carrier, SUM (call_duration)/60 AS Minuten, SUM (call_count) AS Versuch, SUM (antwort_anzahl) AS antwortet, SUM (anfall_Zahl) AS Anfall, SUM (start_call_count) als Count_X, SUM (ner_count) als NER_COUNT, dose_rank() über (Reihenfolge nach sumMinutes desc) (wählen Sie B_NUMBER_COUNTRY, OUTGOING_CARRIER, sum (call_duration) über (Partition von B_NUMBER_COUNTRY) als sumMinutes from bm_archived_cdr) WHERE call_direction = 'O' und call_date = to_date ('2016-04- 21 ',' JJJJ-MM-TT ') Gruppe nach b_number_country, interval_of_day, outgoing_carrier; – deven2020