mysql - 获取最新可接受间隙的日期
mysql - get the date of the latest acceptable gap
我正在努力处理以下情况来提取日期时间。
如果没有 12 个月或更多的时间间隔,它应该 return null(见 id 2)。
如果存在 2 个或更多 12 个月的间隔,则应考虑最近的间隔(参见 id 1)
如果只有一个差距,那么应该考虑这一点(见 id 3)
id | datetime
1 | 2018-01-01
1 | 2018-01-02
1 | 2019-02-01
1 | 2019-02-02
1 | 2020-03-01
1 | 2020-03-02
2 | 2018-01-01
2 | 2018-01-02
3 | 2018-01-01
3 | 2018-01-02
3 | 2019-02-01
预期结果应该是,
id | datetime
1 | 2020-03-01
2 | null
3 | 2019-02-01
结果按id分组。对于 id 1,2020-03-01 是 selected 因为它最接近 id 1 中存在的最近 12 个月或更多个月的差距。(第一个差距是 2019-02-01 - 2018-01- 02 >= 12,第二个差距是 2020-03-01 - 2019-02-02 2020-03-01 是 selected 因为它是最后一个可接受的差距的高度值)
尽管我尝试使用 id 进行分组,但无法循环查看有多少空隙然后 select 最新的空隙。
在postgres中我希望我们可以使用一个带有window函数的lag()函数,这样我就可以对日期时间进行排序并减去两个相邻的日期时间,这可以用作子查询并得到所有结果中的最大值。
但我想在 mysql.
中执行此操作
lag("datetime") over (order by "datetime") - "datetime" as diff,
最后,我找到了使用 MySql 变量的解决方案,
SELECT
data.id,
MAX(data.eligible_datetime)
FROM (
SELECT
z.id,
z.datetime,
IF(TIMESTAMPDIFF(MONTH, @prevDate, z.datetime) > 11 AND @prevID = z.id, z.datetime, NULL) eligible_datetime,
@prevDate := z.datetime,
@prevID := z.id
FROM tablename z,
(
SELECT
@prevID := NULL,
@prevDate := NULL
) vars
ORDER BY z.id, z.datetime
) data
GROUP BY data.id
我正在努力处理以下情况来提取日期时间。
如果没有 12 个月或更多的时间间隔,它应该 return null(见 id 2)。
如果存在 2 个或更多 12 个月的间隔,则应考虑最近的间隔(参见 id 1)
如果只有一个差距,那么应该考虑这一点(见 id 3)
id | datetime
1 | 2018-01-01
1 | 2018-01-02
1 | 2019-02-01
1 | 2019-02-02
1 | 2020-03-01
1 | 2020-03-02
2 | 2018-01-01
2 | 2018-01-02
3 | 2018-01-01
3 | 2018-01-02
3 | 2019-02-01
预期结果应该是,
id | datetime
1 | 2020-03-01
2 | null
3 | 2019-02-01
结果按id分组。对于 id 1,2020-03-01 是 selected 因为它最接近 id 1 中存在的最近 12 个月或更多个月的差距。(第一个差距是 2019-02-01 - 2018-01- 02 >= 12,第二个差距是 2020-03-01 - 2019-02-02 2020-03-01 是 selected 因为它是最后一个可接受的差距的高度值)
尽管我尝试使用 id 进行分组,但无法循环查看有多少空隙然后 select 最新的空隙。
在postgres中我希望我们可以使用一个带有window函数的lag()函数,这样我就可以对日期时间进行排序并减去两个相邻的日期时间,这可以用作子查询并得到所有结果中的最大值。 但我想在 mysql.
中执行此操作lag("datetime") over (order by "datetime") - "datetime" as diff,
最后,我找到了使用 MySql 变量的解决方案,
SELECT
data.id,
MAX(data.eligible_datetime)
FROM (
SELECT
z.id,
z.datetime,
IF(TIMESTAMPDIFF(MONTH, @prevDate, z.datetime) > 11 AND @prevID = z.id, z.datetime, NULL) eligible_datetime,
@prevDate := z.datetime,
@prevID := z.id
FROM tablename z,
(
SELECT
@prevID := NULL,
@prevDate := NULL
) vars
ORDER BY z.id, z.datetime
) data
GROUP BY data.id