选择没有窗口功能的按结果分组的最少数量

时间:2019-01-31 11:13:21

标签: sql group-by aggregate-functions h2

与往常一样,想要处理一个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对我不起作用,结果始终为零。

可以在没有窗口函数的情况下完成此操作,还是我应该接受临时结果并在我的代码中对其进行处理?

2 个答案:

答案 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)

尝试使用相关的子查询HAVINGALL

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