Последнее значение MAX для данного идентификатора - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь создать запрос, чтобы выбрать всех пользователей с их последним максимальным заработанным отчетом.Я пробовал различные объединения, но я либо получаю первый максимальный отчет, либо пользователь игнорируется, если его максимальный отчет был до их последнего отчета.

Для ясности, вот примерданные, с которыми я работаю:

id  user_id  report_id  earned
1   20       1            55
2   20       3            30
...
7   20       3            29
8   40       3            50
9   40       3            50
10  20       3            30
11  40       3            35
...

Я бы хотел выбрать последний отчет с наибольшим заработком для данного report_id для всех пользователей.Для приведенного выше примера желаемый запрос вернет

id  user_id  report_id  earned
9   40       3            50
10  20       3            30

Однако я получаю строки с идентификаторами 2, 8, первые отчеты с максимальным заработком.

Примечания о данных:

  • В первом отчете не гарантируется самый высокий заработок
  • В последнем отчете не гарантируется самый высокий заработок
  • Первый максимум не полученгарантированно будет последним
  • Запрос должен сообщить о последнем максимуме, чтобы получить соответствующий отчет

Любая помощь с проблемой приветствуется.

Редактировать: По запросу, вот запрос, который я пытался использовать (в переводе с реальной проблемы на эту проблему могут быть некоторые синтаксические ошибки).Честно говоря, я переписывал один и тот же запрос, поэтому у меня нет всех моих попыток.

SELECT
    s.id, s.user_id, s.report_id, s.earned
FROM
    submission s
JOIN user u ON s.user_id = u.id
JOIN report r ON s.report_id = r.id
JOIN (SELECT
          t.id AS ID, t.user_id, MAX(s.earned) AS MaxReport
      FROM submission t
      JOIN report r ON t.report_id = r.id
      JOIN user us ON t.user_id = us.id
      WHERE r.id = 3
      GROUP BY t.user_id
      ORDER BY ...
) BestReport ON
(s.id = BestReport.ID AND s.user_id = BestReport.user_id AND s.earned = BestReport.MaxReport
WHERE r.id = 3

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Если предположить, что более высокий идентификатор означает более свежий отчет (лучше хранить временную метку), вы можете использовать оконные функции в последних версиях sqlite, чтобы упростить задачу:

SELECT id, user_id, report_id, earned
FROM (SELECT id, user_id, report_id, earned
           , rank() OVER (PARTITION BY report_id, user_id ORDER BY earned DESC, id DESC) AS ranking
      FROM example)
WHERE ranking=1 AND report_id=3;
id          user_id     report_id   earned    
----------  ----------  ----------  ----------
10          20          3           30        
9           40          3           50        
0 голосов
/ 27 февраля 2019

Я думаю, вам нужно это:

select max(s.id) id, s.user_id, s.report_id, s.earned from (
  select user_id, report_id, max(earned) maxearned
  from submission
  group by user_id, report_id
) g inner join submission s
on s.user_id = g.user_id and s.report_id = g.report_id and s.earned = g.maxearned
group by s.user_id, s.report_id, s.earned

См. Демоверсию Если вы хотите запросить только для report_id = 3:

select max(s.id) id, s.user_id, s.report_id, s.earned from (
  select user_id, report_id, max(earned) maxearned
  from submission
  where report_id = 3
  group by user_id, report_id
) g inner join submission s
on s.user_id = g.user_id and s.report_id = g.report_id and s.earned = g.maxearned
group by s.user_id, s.report_id, s.earned
order by id

См. demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...