首先,了解两条曲线相交的标志是,在给定日期,两个条件之一为真: 第一条曲线大于第二条曲线,并且在上一日期,第二条曲线大于第一条曲线,或者 以上相反的说法是正确的 如果您可以访问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);
以下是示例时间序列数据的图表:
应该清楚的是,在结果集中的三个日期中的每一个日期,与前一个日期相比,这两个时间序列相互交叉。
演示
请注意,这将产生两个图表相交的一对日期的较大值。一般来说,两次约会之间会发生交叉。 编辑: 如果您的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);
1条答案
按热度按时间wvt8vs2t1#
首先,了解两条曲线相交的标志是,在给定日期,两个条件之一为真:
第一条曲线大于第二条曲线,并且在上一日期,第二条曲线大于第一条曲线,或者
以上相反的说法是正确的
如果您可以访问mysql 8+,我们可以尝试使用
LAG
此处的分析函数:以下是示例时间序列数据的图表:
应该清楚的是,在结果集中的三个日期中的每一个日期,与前一个日期相比,这两个时间序列相互交叉。
演示
请注意,这将产生两个图表相交的一对日期的较大值。一般来说,两次约会之间会发生交叉。
编辑:
如果您的mysql版本早于8+,那么我们必须使用另一种方法来查找
LAG
. 一种方法是使用相关子查询:演示