2016-11-28 77 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

该解决方案也会返回正确的结果。谢谢! –