gpt4 book ai didi

sql - 从具有重叠日期的记录中提取名称值

转载 作者:行者123 更新时间:2023-12-03 07:54:38 24 4
gpt4 key购买 nike

我有一个表,其中包含大小随时间变化的区域。区域大小有效的时间范围(以年为单位)存储在“VALID_FROM”和“VALID_UNTIL”列中。一个区域的时间范围不得重叠。我想创建一个查询,用它可以检查某人是否输入了重叠的时间范围。

在示例表中,区域 1 的有效时间范围确实重叠。

表“区域”:

<表类=“s-表”><标题>姓名尺寸VALID_FROMVALID_UNTIL <正文>区域1551990 2005区域140 20002009区域14520102099区域27919902099区域33319901999区域33720002009

请注意,结束日期包括在内,例如area3 的两个日期没有间隔。

得到这样的结果就足够了:

<表类=“s-表”><标题>姓名备注 <正文>区域1“时间范围重叠!”

我的问题是一个区域可能在表中出现n次,我不知道如何比较“VALID_FROM”和“VALID_UNTIL”列(如果可能)一个区域的任意行数。

到目前为止,我已经将表减少到那些多次出现的行。

WITH duplicats AS (
SELECT `NAME`
FROM `areas`
GROUP BY `NAME`
HAVING COUNT(`NAME`) > 1
)
SELECT *
FROM `areas`
INNER JOIN `duplicats`
ON `areas`.`NAME` = `duplicats`.`NAME`

最佳答案

在 MySQL 8.x 中,您可以从 valid_from 值中减去之前的 valid_until 值,如果存在负差,则存在重叠。

select NAME, 'timeframes overlap!' AS Remark
from
(
select *,
VALID_FROM - lag(VALID_UNTIL) over (partition by NAME order by VALID_FROM) df
from areas
) t
group by NAME
having sum(df <= 0) > 0

demo

关于sql - 从具有重叠日期的记录中提取名称值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76340797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com