2016-11-28 7 views
0

Как бы мне нужно изменить следующий SQLite3 запрос, чтобы получить только строку с самыми высокими итогами сгруппированных по неделям:SQL выберите верхний SUM сгруппированных по неделям

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 y, чтобы удалить лишние лишние строки?

ответ

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

Во-первых, используйте КТР. Тогда простой JOIN или WHERE пункт будет делать:

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 или более поздней версии, вы можете вернуть строку с наибольшим значением в группе с максимальным():

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

Это решение также возвращает правильные результаты. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^