2016-11-28 83 views
0

分組頂部SUM我如何將需要更改以下SQLite3的查詢來獲取只是按星期分組最高總計行:SQL選擇由

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 

上面的查詢返回以下結果:

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

我想只顯示頂行,而每星期:

week_number - cards - user_id 
44   5  1 
45   2  2 

有一些技巧來調整QUER ❖刪除不必要的額外行?

回答

0

嘗試使用NOT EXISTS()

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

有了一個快速的測試,這似乎給正確的結果。謝謝! –

0

首先,使用CTE。然後簡單JOINWHERE條款會做:

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; 

注意,這將返回多行如果有多個行有某一週相同最大值。

+0

這也給出了正確的結果,謝謝!在相同最大值的情況下返回多行是一個很好的補充。順便說一句,當我在SQLiteStudio中運行這個查詢時,它顯示正確的結果,但它也給出了這個警告:「SQLiteStudio無法從查詢中提取元數據,結果將不可編輯。」這有什麼好擔心的嗎? –

+0

@ J.Harwood。 。 。這不是什麼可擔心的事情。 –

0

在SQLite的3.7.11或更高版本,你可以用MAX()返回一組與最高值的行:

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

該解決方案也會返回正確的結果。謝謝! –