Выберите минимальное количество групп по результату без оконных функций - PullRequest
0 голосов
/ 31 января 2019

Как всегда, хочу сделать с одним запросом sql.Иметь таблицу попыток отправки:

ID  TIMESTAMP            TASK_ID
1   2019-01-30 15:29:38  1
2   2019-01-30 15:29:39  1
3   2019-01-30 15:29:40  2
4   2019-01-30 15:29:41  3

Таблица задач:

ID  EMAIL            
1   boxOne@test.com
2   boxOne@test.com
3   boxTwo@test.com

Цель состоит в том, чтобы получить идентификаторы задач для уникальных писем с минимальным количеством попыток (в нашем случае это 2 и3).Проблема номер один в том, что я хочу сделать несколько тестов, используя H2, который не поддерживает оконные функции.Проблема вторая в том, что несколько задач могут иметь один и тот же адрес электронной почты.

Попробовал это:

SELECT TASK.id, TASK.EMAIL, count(att.TASK_ID)
FROM TASK
JOIN ATTEMPTS on TASK.id = ATTEMPTS.TASK_ID
GROUP BY ATTEMPTS.TASK_ID

и получить такой результат:

TASK.id  EMAIL            count(TASK.id)
1        boxOne@test.com  2
2        boxOne@test.com  1
3        boxTwo@test.com  1

, но мне нужно минимальное количество для каждогоуникальный адрес электронной почты, подобный этому:

TASK.id  EMAIL            count(TASK.id)
2        boxOne@test.com  1
3        boxTwo@test.com  1

min (count (TASK.id)) не работал для меня, результат всегда равен нулю.

Может ли это быть сделано без оконных функций, или я долженпринять временный результат и обработать его в моем коде?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Попробуйте использовать коррелированный подзапрос, HAVING и ALL

SELECT t.id, t.email, count(a.task_ID) cnt
FROM task t
JOIN attempts a on t.id = a.task_ID
GROUP BY t.id, t.email
HAVING count(a.task_ID) <= ALL
(
    SELECT count(a.task_ID)
    FROM task t2
    JOIN attempts a on t2.id = a.task_ID
    WHERE t2.email = t.email
    GROUP BY t2.id
)

DEMO

0 голосов
/ 31 января 2019

вы можете попробовать с помощью коррелированного подзапроса

select distinct t1.* from 
(
SELECT TASK.id, TASK.EMAIL, count(att.TASK_ID) cnt
FROM TASK
JOIN ATTEMPTS on TASK.id = ATTEMPTS.TASK_ID
group by TASK.id, TASK.EMAIL
) t1 where t1.cnt= (select min(cnt) from 
                       (SELECT TASK.id, TASK.EMAIL, count(att.TASK_ID) cnt
                       FROM TASK
                       JOIN ATTEMPTS on TASK.id = ATTEMPTS.TASK_ID
                        group by TASK.id, TASK.EMAIL
                       ) t2 where t2.EMAIL=t1.EMAIL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...