gpt4 book ai didi

mysql - MYSQL中的交叉检测

转载 作者:行者123 更新时间:2023-11-29 10:01:03 25 4
gpt4 key购买 nike

如果 MySQL 有一个表,其中包含三列,其中一列是日期,另外两列是数量 1 和数量 2。我试图找到由数量 1 与日期绘制的曲线与数量 2 交叉的所有日期与日期?问题是有时数据可能不包含交叉发生的点,在这种情况下,我应该在交叉后不久找到日期有什么方法可以在 MySQL 中做到这一点吗?

最佳答案

首先,了解两条曲线交叉的标记是,在给定日期,两个条件之一为真:

  • 第一条曲线大于第二条曲线,并且在前一天,第二条曲线大于第一条曲线,或者
  • 与上述相反的是正确的

鉴于您可以访问 MySQL 8+,我们可以尝试在此处使用 LAG 分析函数:

WITH yourTable AS (
SELECT '2018-01-01' AS date, 1 AS quantity1, 5 AS quantity2 UNION ALL
SELECT '2018-01-02', 3, 4 UNION ALL
SELECT '2018-01-03', 4, 3 UNION ALL
SELECT '2018-01-04', 2, 5 UNION ALL
SELECT '2018-01-05', 4, 7 UNION ALL
SELECT '2018-01-06', 9, 8
),
cte AS (
SELECT
date, quantity1, quantity2,
LAG(quantity1) OVER (ORDER BY date) AS q1lag,
LAG(quantity2) OVER (ORDER BY date) AS q2lag
FROM yourTable
)

SELECT
date
FROM cte
WHERE
(quantity1 > quantity2 AND q1lag < q2lag) OR
(quantity2 > quantity1 AND q2lag < q1lag);

enter image description here

这是样本时间序列数据的图表:

enter image description here

应该清楚的是,在结果集中的三个日期中,两个时间序列与前一个日期相比相互交叉。

Demo

请注意,这将产生两个图表交叉的一对日期中的较大值。一般来说,交叉会发生在两个日期之间。

编辑:

如果您的 MySQL 版本早于 8+,那么我们将不得不使用另一种方式来查找 LAG。一种选择是使用相关子查询:

SELECT date
FROM
(
SELECT
date, quantity1, quantity2,
(SELECT quantity1 FROM yourTable t2
WHERE t2.date < t1.date ORDER BY t2.date DESC LIMIT 1) AS q1lag,
(SELECT quantity2 FROM yourTable t2
WHERE t2.date < t1.date ORDER BY t2.date DESC LIMIT 1) AS q2lag
FROM yourTable t1
) t
WHERE
(quantity1 > quantity2 AND q1lag < q2lag) OR
(quantity2 > quantity1 AND q2lag < q1lag);

Demo

关于mysql - MYSQL中的交叉检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52963837/

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