繁体   English   中英

当数据中有空值时,sql查询从多列中获取最新数据

[英]sql query to get latest data from multiple columns when there are nulls in the data

我有一个看起来像的 sql 表

+--------------------------+------------+-----------------+---------+------+-------+-------------+-------------------------+----------------------------+-------+-------+
| deviceID                 | date       | timestamp       | counter | rssi | vavId | nvo_airflow | nvo_air_damper_position | nvo_temperature_sensor_pps | block | floor |
+--------------------------+------------+-----------------+---------+------+-------+-------------+-------------------------+----------------------------+-------+-------+
| fd00::212:4b00:1957:d616 | 2020-02-29 | 12:40:01.513066 |     805 |   91 |     7 |        NULL |                    NULL |                      26.49 | NULL  | ABCD  |
| fd00::212:4b00:1957:d616 | 2020-02-29 | 12:41:01.542272 |     807 |   94 |     5 |        NULL |                    NULL |                      26.37 | NULL  | ABCD  |
| fd00::212:4b00:1957:d616 | 2020-02-29 | 12:43:01.699023 |     811 |   90 |     7 |        50   |                    NULL |                       NULL | NULL  | ABCD  |
| fd00::212:4b00:1957:d616 | 2020-02-29 | 12:46:01.412259 |     817 |   64 |    26 |        NULL |                    NULL |                      25.85 | NULL  | ABCD  |
| fd00::212:4b00:1957:d616 | 2020-02-29 | 12:48:01.576133 |     821 |   91 |    26 |        NULL |                    NULL |                      27.54 | NULL  | ABCD  |
| fd00::212:4b00:1957:d616 | 2020-02-29 | 12:49:01.529593 |     823 |   91 |     7 |        45   |                     72  |                       NULL | NULL  | ABCD  |

我想编写一个查询,在其中获取所有 vavId 的nvo_airflow,nvo_air_damper_position,nvo_temperature_sensor_pps的最新非空值(基于时间戳),或者说特定的 vavId 7 。

如果我们考虑 vav 7 它应该返回

nvo_airflow,nvo_air_damper_position,nvo_temperature_sensor_pps, vavId
45,72,26.49

如果没有空值,我可以编写一个获取最新值的查询

"""SELECT t1.deviceId, t1.date, t1.vavId, t1.timestamp, t1.nvo_airflow , t1.nvo_air_damper_position , t1.nvo_temperature_sensor_pps
             FROM
                 (SELECT deviceId, date, nvo_airflow, nvo_air_damper_position, nvo_temperature_sensor_pps, vavId, timestamp, counter from vavData where date=%s and floor=%s) t1
             INNER JOIN
                  (SELECT date,max(timestamp) as timestamp,vavId from vavData where date=%s and floor=%s group by vavId) t2
             ON (t1.timestamp = t2.timestamp) order by t1.vavId"""

但我很困惑如何为有一些空值的多列获取最新数据。 有人可以帮我写一个查询吗

SELECT
    nvo_airflow,nvo_air_damper_position,nvo_temperature_sensor_pps, vavId
FROM
    vavData 
WHERE NOT ( nvo_airflow IS NULL 
            OR nvo_air_damper_position IS NULL 
            OR nvo_temperature_sensor_pps IS NULL )
ORDER BY `date` DESC, `timestamp` DESC

选择并排序数据where not将排除具有 NULL 值的列。

此查询将返回所有行,最新的第一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM