我每天都有一个审核表。所有添加/修改/删除记录均已存储。删除任何记录后,第二天就不会显示。像下面这样。
Date records
---- --------
15th 100
16th 102 - Pickup all records, between 15 and 16, which are not in 16th
17th 110 - Pickup all records, between 16 and 17, which are not in 17th
18th 150 - Pickup all records, between 17 and 18, which are not in 18th
.. So on..
这是一个审核表,该表在前一天已删除记录,但今天不存在。我需要提取日期之间的所有已删除记录。 但是我不想对日期进行硬编码,相反,它应该可以从日期到Today()
如何在单个SQL查询中实现此目标?我尝试使用“联盟”功能,但带有硬编码日期。到目前为止,有什么方法可以作为通用查询实现。
答案 0 :(得分:0)
您可以使用两个级别的聚合。第一个获取每个ID的最长日期。次日删除的第二条记录:
select max_date + interval 1 day, count(*)
from (select a.id, max(date) as max_date
from audit a
group by a.id
) t
group by max_date
order by max_date;
您可能希望where
子句将最大日期限制为数据中最大日期之前的日期(否则所有内容看起来都将在第二天被删除)。
另一种方法使用lead()
:
select date + 1, count(*)
from (select a.*,
lead(date) over (partition by id order by date) as next_date
from audit a
) t
where next_date <> date_add(date, INTERVAL 1 DAY) or next_date is null
group by date
order by date;
如果记录可以恢复,而您仍然希望在记录消失时将其视为已删除,则这是更好的方法。
Here是db <>小提琴。