2017-10-26 1 views
1

Wie kann ich die Top 3 Ausnahmen pro Tag mit U-SQL extrahieren?U-SQL Wie wählt man die besten 3 Ausnahmen für jedes Datum aus?

enter image description here

ich das Ergebnis wollen wie folgt aussehen:

enter image description here

+0

Was Sie bisher versucht haben? Sie können Gruppieren nach und Summe und Dinge wie das .. Das sollte Sie gehen –

+0

Ich löste es mit ARRAY_AGG auf Ausnahme mit Gruppierung am Datum. Dann habe ich für jedes Datum ein Array bekommen. Von hier aus könnte ich ein Inline-C# verwenden, um die ersten drei Indizes im Array zurückzugeben! :) –

+0

Classic [Tag: Größte-N-pro-Gruppe] Problem. –

Antwort

3

Eine Möglichkeit, dies in U-SQL zu erreichen, ist die ROW_NUMBER Ranking-Funktion nach Datum und geordnet partitioniert zu verwenden, indem Sie Ihre absteigend zählen. Zum Beispiel:

@input = SELECT * 
    FROM (
     VALUES 
      ("2016-01-01T00:00:00", "System.ArgumentNullException", 7), 
      ("2016-01-01T00:00:00", "System.IO.EndOfStreamException", 5), 
      ("2016-01-01T00:00:00", "System.IO.FileNotFoundException", 4), 
      ("2016-01-01T00:00:00", "System.IndexOutofRangeException", 4), 
      ("2016-01-01T00:00:00", "System.ArgumentException", 3), 
      ("2016-01-02T00:00:00", "System.BadImageFormatException", 18), 
      ("2016-01-02T00:00:00", "System.IO.EndOfStreamException", 16), 
      ("2016-01-02T00:00:00", "System.NotImplementedException", 14), 
      ("2016-01-02T00:00:00", "System.UnauthorizedAccessException", 13), 
      ("2016-01-02T00:00:00", "System.ArgumentException", 12), 
      ("2016-01-02T00:00:00", "System.IndexOutofRangeException", 5), 
      ("2016-01-03T00:00:00", "System.IO.EndOfStreamException", 45), 
      ("2016-01-03T00:00:00", "System.FormatException", 42), 
      ("2016-01-03T00:00:00", "System.BadImageFormatException", 41), 
      ("2016-01-03T00:00:00", "System.IndexOutofRangeException", 41), 
      ("2016-01-03T00:00:00", "System.IO.FileNotFoundException", 40) 

    ) AS x(date, exception, count); 



// Add row number to resultset based on date and count descending 
@working = 
    SELECT ROW_NUMBER() OVER(PARTITION BY date ORDER BY count DESC) AS rn, 
      * 
    FROM @input; 


// Top 3 by date? 
@output = 
    SELECT * 
    FROM @working 
    WHERE rn <= 3; 


OUTPUT @output TO "/output/output.csv" 
USING Outputters.Csv(); 

Meine Ergebnisse:

Results

Verwandte Themen