MYSQL中的交叉检测
如果有一个表是MySQL,它包含三列,一列是日期,另外两列是数量1和数量2。我试图找到所有的日期,其中数量1与日期绘制的曲线与数量2与日期相交?问题是,有时数据可能不包含交叉发生的点,在这种情况下,我应该在交叉发生后很快找到日期。有什么方法可以在MySQL中这样做吗?首先,请注意,两条曲线交叉的标记是,在给定日期,两个条件之一为真:MYSQL中的交叉检测,mysql,relational-database,mysql-workbench,Mysql,Relational Database,Mysql Workbench,如果有一个表是MySQL,它包含三列,一列是日期,另外两列是数量1和数量2。我试图找到所有的日期,其中数量1与日期绘制的曲线与数量2与日期相交?问题是,有时数据可能不包含交叉发生的点,在这种情况下,我应该在交叉发生后很快找到日期。有什么方法可以在MySQL中这样做吗?首先,请注意,两条曲线交叉的标记是,在给定日期,两个条件之一为真: 第一条曲线大于第二条曲线,并且在上一个日期,第二条曲线大于第一条曲线,或者 上述情况正好相反 假设您可以访问MySQL 8+,我们可以在这里尝试使用LAG分析函
- 第一条曲线大于第二条曲线,并且在上一个日期,第二条曲线大于第一条曲线,或者
- 上述情况正好相反
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?你有权访问MySQL 8+?@TimBiegeleisenyes@TimBiegeleiseni我在MySQL workbench 8.0中运行了上述代码,它生成了错误1064。@RamSuryaSriShourieMummadav我不知道该说什么。它在MySQL 8演示中运行,没有问题。您确定您使用的是MySQL 8或更高版本吗?我使用的是MySQL Workbench 8.0,它是否等同于MySQL 8?是的,您应该很好。确切的错误信息是什么?错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在“yourTable AS(选择“2018-01-01”作为日期,1作为数量1,5作为数量2 U”附近使用的正确语法
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);