我有一个请求表和一个工作表。对于请求类型1、2、4或5,我需要对类型6或7执行的工作求和,其中6表示有效+1,7表示有效-1。排除请求的工作求和〈=0或在最近请求之前已完成工作的任何请求。
查询详细信息包括:
- 按createDate查找请求类型(1,2,4,5)。
- 对于找到的每个请求日期,将(6,7)中的工作类型相加为+1或-1,直到下一个请求createDate。
- 在下一个请求之前输出任何请求工作总和〉0。
示例表:
create table request
(
Id bigint not null,
userId bigint,
type bigint not null,
creationDate timestamp not null
);
create table work
(
Id bigint not null,
type bigint not null,
creationDate timestamp not null
);
样本数据:
insert into request (Id, userId, type, creationDate)
values (4, 45, 2, '2022-12-12 11:02:17'),
(9, 64, 2, '2022-12-12 01:01:18'),
(2, 92, 2, '2022-12-11 21:36:36'),
(2, 21, 2, '2022-12-11 21:25:54'),
(1, 3, 2, '2022-12-11 21:13:58'),
(7, 243, 2, '2022-12-11 21:04:05'),
(8, 24, 2, '2022-12-11 21:01:23');
insert into work (Id, type, creationDate)
values (3, 7, '2022-12-11 00:00:00'),
(6, 7, '2022-12-11 00:00:00'),
(11, 7, '2022-12-11 00:00:00'),
(6, 7, '2022-12-11 00:00:00'),
(1, 6, '2022-12-11 00:00:00'),
(2, 6, '2022-12-11 00:00:00'),
(11, 7, '2022-12-11 00:00:00'),
(5, 7, '2022-12-11 00:00:00'),
(1, 6, '2022-12-11 00:00:00'),
(11, 7, '2022-12-12 00:00:00'),
(4, 6, '2022-12-12 00:00:00'),
(8, 7, '2022-12-12 00:00:00');
尝试的查询:
select id, sum(total), type, creationDate from (
select id, 0 as total, type, creationDate from request
union
select id, case type when 6 then 1 when 7 then -1 end as total, type, creationDate from work
) a where total > 0 group by id
这在实时数据上花费的时间太长,但在小集合like this fiddle上有效。
数据中存在一个挑战,请求的时间戳包括时间,但工作只有日期而没有时间戳。
小提琴奏道:
| 身份证|总计|类型|创建日期|
| - ------|- ------|- ------|- ------|
| 1个|1个|六个|2022年12月11日上午00时00分|
| 第二章|1个|六个|2022年12月11日上午00时00分|
| 四个|1个|六个|2022年12月13日00时00分|
但是1和2都是无效的,因为请求的时间戳在技术上大于工作。预期输出应该是:
| 身份证|总计|类型|创建日期|
| - ------|- ------|- ------|- ------|
| 四个|1个|六个|2022年12月13日00时00分|
对于id = 4,工作的日期为2022-12-13 00:00:00,请求的时间戳为2022-12-12 11:02:17。
1条答案
按热度按时间ykejflvf1#
实现此目的的一种方法是使用子查询将两个表连接在一起,然后对结果进行分组
下面是一个例子: