与往常一样,想要处理一个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
目的是获取尝试次数最少的独特电子邮件的任务ID(在我们的示例中为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))min对我不起作用,结果始终为零。
可以在没有窗口函数的情况下完成此操作,还是我应该接受临时结果并在我的代码中对其进行处理?
答案 0 :(得分:1)
您可以尝试使用相关子查询
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)
答案 1 :(得分:1)
尝试使用相关的子查询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
)