Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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各列和行datetime的最后一个非空值_Mysql_Sql_Date_Pivot_Window Functions - Fatal编程技术网

MySql各列和行datetime的最后一个非空值

MySql各列和行datetime的最后一个非空值,mysql,sql,date,pivot,window-functions,Mysql,Sql,Date,Pivot,Window Functions,我在一个名为“test”的MySQL(10.1.44-MariaDB)中有一个名为“raw_temp”的表 它以以下格式保存传感器值,不幸的是,我无法对该格式做任何更改 +----+--------+--------+--------+--------+--------+--------+---------------------+ | id | api | value1 | value2 | value3 | value4 | value5 | reading_time |

我在一个名为“test”的MySQL(10.1.44-MariaDB)中有一个名为“raw_temp”的表


它以以下格式保存传感器值,不幸的是,我无法对该格式做任何更改

+----+--------+--------+--------+--------+--------+--------+---------------------+
| id |  api   | value1 | value2 | value3 | value4 | value5 |    reading_time     |
+----+--------+--------+--------+--------+--------+--------+---------------------+
|  1 | asdasd | 1968   | 19.70  | 52.50  | NULL   | NULL   | 2020-03-02 21:34:46 |
|  2 | asdasd | NULL   | NULL   | NULL   | 100    | NULL   | 2020-03-02 21:35:46 |
|  3 | asdasd | 1974   | 19.70  | 52.50  | NULL   | NULL   | 2020-03-02 21:37:47 |
|  4 | asdasd | NULL   | NULL   | NULL   | NULL   | 88     | 2020-03-02 21:39:05 |
|  5 | xdfsgh | 2543   | NULL   | NULL   | NULL   | NULL   | 2020-03-02 21:39:49 |
+----+--------+--------+--------+--------+--------+--------+---------------------+
如果阅读时间介于“2020-03-02 21:35:01”和“2020-03-02 21:40:00”之间,我希望能够从SELECT查询中获得以下信息。每个“api”值仅一行,值列显示最后一个非空读取值(如果没有显示空值),值读取时间列显示该值的相关读取时间(希望与下表一起使用)


在MySQL SELECT语句中(我还可以选择使用Python创建摘要(我猜是使用循环和列表)是否可能实现这一点?上面是一个例子,实际上大约有2000行传感器值和150个api值,我希望查询在中运行。如果您运行的是MySQL 8.0,您可以在子查询中使用窗口函数来计算每个值的最后可用日期,然后进行条件聚合

以下是三个值的示例:

select
    api,
    max(case when reading_time = max_reading_time_1 then value1 end) value1,
    max_reading_time_1,
    max(case when reading_time = max_reading_time_2 then value2 end) value2,
    max_reading_time_2,
    max(case when reading_time = max_reading_time_3 then value3 end) value3,
    max_reading_time_3
from (
    select
        t.*,
        max(case when value1 is not null then reading_time else end) 
            over(partition by api) max_reading_time_1,
        max(case when value2 is not null then reading_time else end)
            over(partition by api) max_reading_time_2,
        max(case when value3 is not null then reading_time else end) 
            over(partition by api) max_reading_time_3
    from t
) t
where reading_time in (max_reading_time_1, max_reading_time_2, max_reading_time_3)
group by api

“我不能做任何关于格式的事情。”这是一个悲剧。这给了我很多关于如何做的想法,以及其他一些任务-非常感谢!
select
    api,
    max(case when reading_time = max_reading_time_1 then value1 end) value1,
    max_reading_time_1,
    max(case when reading_time = max_reading_time_2 then value2 end) value2,
    max_reading_time_2,
    max(case when reading_time = max_reading_time_3 then value3 end) value3,
    max_reading_time_3
from (
    select
        t.*,
        max(case when value1 is not null then reading_time else end) 
            over(partition by api) max_reading_time_1,
        max(case when value2 is not null then reading_time else end)
            over(partition by api) max_reading_time_2,
        max(case when value3 is not null then reading_time else end) 
            over(partition by api) max_reading_time_3
    from t
) t
where reading_time in (max_reading_time_1, max_reading_time_2, max_reading_time_3)
group by api