MariaDB:使用案例将请求与总计>0的已执行工作进行匹配

eoxn13cs  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个请求表和一个工作表。对于请求类型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。

ykejflvf

ykejflvf1#

实现此目的的一种方法是使用子查询将两个表连接在一起,然后对结果进行分组
下面是一个例子:

SELECT r.Id, SUM(CASE w.type WHEN 6 THEN 1 WHEN 7 THEN -1 END) as total, r.type, r.creationDate
FROM request r
JOIN (
  SELECT Id, type, creationDate
  FROM work
  WHERE type IN (6,7)
) w ON w.creationDate >= r.creationDate
WHERE r.type IN (1,2,4,5)
GROUP BY r.Id, r.type, r.creationDate
HAVING total > 0

相关问题