Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL中的交叉检测_Mysql_Relational Database_Mysql Workbench - Fatal编程技术网

MYSQL中的交叉检测

MYSQL中的交叉检测,mysql,relational-database,mysql-workbench,Mysql,Relational Database,Mysql Workbench,如果有一个表是MySQL,它包含三列,一列是日期,另外两列是数量1和数量2。我试图找到所有的日期,其中数量1与日期绘制的曲线与数量2与日期相交?问题是,有时数据可能不包含交叉发生的点,在这种情况下,我应该在交叉发生后很快找到日期。有什么方法可以在MySQL中这样做吗?首先,请注意,两条曲线交叉的标记是,在给定日期,两个条件之一为真: 第一条曲线大于第二条曲线,并且在上一个日期,第二条曲线大于第一条曲线,或者 上述情况正好相反 假设您可以访问MySQL 8+,我们可以在这里尝试使用LAG分析函

如果有一个表是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);

您使用的是什么版本的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);