Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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:使用subselect计算本地化的最小最大值_Mysql_Sql_Max_Min_Subquery - Fatal编程技术网

MySQL:使用subselect计算本地化的最小最大值

MySQL:使用subselect计算本地化的最小最大值,mysql,sql,max,min,subquery,Mysql,Sql,Max,Min,Subquery,我正在MySQL中基于过去五次观察的相对值构建一个规范化数据集。为此,我需要知道过去五个数据点的最大值和最小值是多少。我正在开发一个子选择,其工作原理如下: 我需要得到表中前五次出现的最小值和最大值。虽然我的表格目前是按DESC顺序排列的,但我不能依靠它来维护该结构,因为特定my_ID的最近_日期的后续更新将更改最近的5,并更新my_值 这是我正在处理的基本表的一部分 MY_ID | RECENT_DATE | MY_VALUE 392, 2013-10-06 12:00:00,

我正在MySQL中基于过去五次观察的相对值构建一个规范化数据集。为此,我需要知道过去五个数据点的最大值和最小值是多少。我正在开发一个子选择,其工作原理如下:

我需要得到表中前五次出现的最小值和最大值。虽然我的表格目前是按DESC顺序排列的,但我不能依靠它来维护该结构,因为特定my_ID的最近_日期的后续更新将更改最近的5,并更新my_值

这是我正在处理的基本表的一部分

    MY_ID | RECENT_DATE | MY_VALUE
    392, 2013-10-06 12:00:00, 18332
    146, 2013-09-06 12:00:00, 5623
    72, 2013-09-02 12:00:00, 23242
    643, 2013-09-01 12:00:00, 15242
    492, 2013-08-06 12:00:00, 15332
    346, 2013-07-26 12:00:00, 17332
    172, 2013-07-22 12:00:00, 14001
    123, 2013-07-22 12:00:00, 13918
    243, 2013-07-11 12:00:00, 23229
最后我需要它看起来像

    MY_ID | RECENT_DATE | MY_VALUE | MAX_VALUE | MIN_VALUE
    392, 2013-10-06 12:00:00, 18332, 23242, 5623
    146, 2013-09-06 12:00:00, 5623, 23242, 5623
    72, 2013-09-02 12:00:00, 23242, 23242, 14001
    643, 2013-09-01 12:00:00, 15242, 17332, 13918
    492, 2013-08-06 12:00:00, 15332, 23229, 13918
    346, 2013-07-26 12:00:00, 17332, 23229, 13918
    172, 2013-07-22 12:00:00, 14001, 23229, 13918
    123, 2013-07-22 12:00:00, 13918, 23229, 13918
    243, 2013-07-11 12:00:00, 23229, 23229, 23229
这是一个快速的示例表

CREATE TABLE IF NOT EXISTS dbo.baseTable
(
    MY_ID BIGINT(20) UNSIGNED, 
    RECENT_DATE DATETIME, 
    MY_VALUE BIGINT(20), 
);

INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (392, '2013-10-06 12:00:00', 18332);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (146, '2013-09-06 12:00:00', 5623);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (72, '2013-09-02 12:00:00', 23242);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (643, '2013-09-01 12:00:00', 15242);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (492, '2013-08-06 12:00:00', 15332);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (346, '2013-07-26 12:00:00', 17332);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (172, '2013-07-22 12:00:00', 14001);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (123, '2013-07-22 12:00:00', 13918);
INSERT INTO dbo.baseTable (MY_ID, RECENT_DATE, MY_VALUE) VALUES (243, '2013-07-11 12:00:00', 23229);
下面是我的一次彻底的查询尝试:

SELECT DISTINCT t1.MY_ID,
        t1.RECENT_DATE,
        t1.MY_VALUE, MAX(t2.MY_VALUE) AS MAX_MY_VALUE, MIN(t2.MY_VALUE) AS MIN_MY_VALUE
FROM dbo.baseTable t1
    INNER JOIN (
        SELECT t.MY_ID, t1.RECENT_DATE, t.MY_VALUE
            FROM dbo.baseTable t
            WHERE t.RECENT_DATE <= t1.RECENT_DATE
            LIMIT 5) AS t2 ON t1.MY_ID = t2.MY_ID
/* WHERE OMITTED */
ORDER BY t1.RECENT_DATE DESC
;

此查询应返回您需要的结果:

SELECT
  ta.MY_ID, ta.MY_ID, ta.RECENT_DATE, ta.MY_VALUE,
  MAX(tb.MY_VALUE),
  MIN(tb.MY_VALUE)
FROM (
  SELECT
    t1.MY_ID,
    t1.RECENT_DATE,
    t1.MY_VALUE,
    SUBSTRING_INDEX(GROUP_CONCAT(t2.MY_ID ORDER BY t2.RECENT_DATE DESC), ',', 5) as Last_5
  FROM
    baseTable t1 INNER JOIN baseTable t2
    ON t1.recent_date >= t2.recent_date
  GROUP BY
    t1.my_id
) ta INNER JOIN baseTable tb ON FIND_IN_SET(tb.MY_ID, Last_5)
GROUP BY
  ta.MY_ID
ORDER BY
  RECENT_DATE DESC
它不是标准的SQL,使用了一些MySQL技巧。
请参阅fiddle。

目前正在我的db上测试此功能。你的小提琴棒极了。令人震惊。这太棒了。另一方面,任何使用支持窗口和分区的不同RDBMS登录到该页面的人,都可以使用它。