2016-11-28 4 views
0

Wie würde ich die folgende SQLite3 Abfrage ändern, müssen nur die Zeile mit der höchsten Summen von Woche gruppiert zu erhalten:SQL nach Woche gruppiert oben SUM wählen

SELECT 
strftime('%W', date(p.match_date, 'unixepoch', 'localtime')) AS week_number, 
sum(red_cards + yellow_cards) AS cards, user_id 
FROM user_records 
GROUP BY week_number, user_id 
ORDER BY week_number, cards DESC 

Die obige Abfrage die folgenden Ergebnisse zurückgibt:

week_number - cards - user_id 
44   5  1 
44   1  2 
45   2  2 
45   1  1 

ich versuche nur die oberste Zeile für jede Woche zu zeigen:

week_number - cards - user_id 
44   5  1 
45   2  2 

gibt es einen Trick, um die quer zu justieren y, um die unnötigen zusätzlichen Zeilen zu löschen?

Antwort

0

Versuchen NOT EXISTS() mit:

SELECT s.* FROM ( 
    SELECT 
     strftime('%W', date(p.match_date, 'unixepoch', 'localtime')) AS week_number, 
     sum(red_cards + yellow_cards) AS cards, user_id 
    FROM user_records 
    GROUP BY week_number, user_id) s 
WHERE NOT EXISTS(SELECT 1 FROM user_records p 
       WHERE strftime('%W', date(p.match_date, 'unixepoch', 'localtime')) = s.week_number 
       GROUP BY p.user_id 
       HAVING SUM(red_cards + yellow_cards) > s.cards) 
+0

Mit einem schnellen Test, scheint dies die richtigen Ergebnisse zu geben. Vielen Dank! –

0

zunächst einen CTE verwenden. Dann wird eine einfache JOIN oder WHERE Klausel tun:

WITH w as (
     SELECT strftime('%W', date(p.match_date, 'unixepoch', 'localtime')) AS week_number, 
      SUM(red_cards + yellow_cards) AS cards, user_id 
     FROM user_records 
     GROUP BY week_number, user_id 
    ) 
SELECT w.* 
FROM w 
WHERE w.cards = (SELECT MAX(w2.cards) 
       FROM w w2 
       WHERE w2.week_number = w.week_number 
       ) 
ORDER BY week_number; 

Beachten Sie, dass diese mehrere Zeilen zurück, wenn mehrere Zeilen den gleichen Maximalwert für eine bestimmte Woche.

+0

Dies gibt auch korrekte Ergebnis, danke! Die Rückgabe mehrerer Zeilen bei gleichem Maximalwert ist eine gute Ergänzung. By the way, wenn ich diese Abfrage in SQLiteStudio ausführen, zeigt es korrekte Ergebnis, aber es gibt auch diese Warnung: "SQLiteStudio konnte Metadaten aus der Abfrage nicht extrahieren. Ergebnisse können nicht bearbeitet werden." Ist das etwas, worüber man sich Sorgen machen muss? –

+0

@ J.Harwood. . . Das ist nichts worüber man sich Sorgen machen muss. –

0

In SQLite 3.7.11 oder später, können Sie die Zeile mit dem höchsten Wert in einer Gruppe mit max() zurückgeben können:

SELECT week_number, 
     max(cards) AS cards, 
     user_id 
FROM (SELECT strftime('%W', date(p.match_date, 'unixepoch', 'localtime')) AS week_number, 
      sum(red_cards + yellow_cards) AS cards, 
      user_id 
     FROM user_records 
     GROUP BY week_number, user_id) 
GROUP BY week_number 
ORDER BY week_number; 
+0

Diese Lösung gibt auch korrekte Ergebnisse zurück. Vielen Dank! –