簡體   English   中英

將 MySQL 中的行與同一時間戳上的 null 值合並

[英]Merging rows in MySQL with null values on same timestamp

我有一個查詢,它返回我想要的所有數據,但由於 case 語句的執行方式,還有很多額外的 null 值。 我試圖擺脫所有 null 值,每個時間戳只有一行數據。 這是查詢:

SELECT
    FROM_UNIXTIME(t_stamp/1000, '%b %D, %Y %h:%i %p') as t_stamp,
    (case when t.id = 460 then s.floatvalue end) as ait_3022_btu_dry,
    (case when t.id = 460 then s.dataintegrity end) as ait_3022_btu_dry_qual,
    (case when t.id = 481 then s.floatvalue end) as ait_3022_ch4,
    (case when t.id = 481 then s.dataintegrity end) as ait_3022_ch4_qual,
    (case when t.id = 622 then s.floatvalue end) as fqe_3004_cd_lr,
    (case when t.id = 622 then s.dataintegrity end) as fqe_3004_cd_lr_qual,
    (case when t.id = 641 then s.floatvalue end) as at_3005,
    (case when t.id = 641 then s.dataintegrity end) as at_3005_qual,
    (case when t.id = 647 then s.floatvalue end) as ft_3004_scfm,
    (case when t.id = 647 then s.dataintegrity end) as ft_3004_scfm_qual,
    (case when t.id = 934 then s.floatvalue end) as ft_3005_scfm,
    (case when t.id = 934 then s.dataintegrity end) as ft_3005_scfm_qual
FROM sqlt_data_1_2019_10 s
    inner join sqlth_te t
    on s.tagid = t.id
WHERE
    (s.floatvalue AND s.dataintegrity) IS NOT NULL
    AND 
    (t_stamp >= 1570597200000 and t_stamp <= 1570629600000)
    AND 
    (tagid = 934
    or tagid = 647
    or tagid = 622
    or tagid = 641
    or tagid = 460
    or tagid = 481)
ORDER BY t_stamp ASC

這是它返回的內容: 在此處輸入圖像描述

每個時間戳我只需要返回一行

您只需要打開聚合:

SELECT
    FROM_UNIXTIME(t_stamp/1000, '%b %D, %Y %h:%i %p') as t_stamp,
    MAX(case when t.id = 460 then s.floatvalue end) as ait_3022_btu_dry,
    MAX(case when t.id = 460 then s.dataintegrity end) as ait_3022_btu_dry_qual,
    MAX(case when t.id = 481 then s.floatvalue end) as ait_3022_ch4,
    MAX(case when t.id = 481 then s.dataintegrity end) as ait_3022_ch4_qual,
    MAX(case when t.id = 622 then s.floatvalue end) as fqe_3004_cd_lr,
    MAX(case when t.id = 622 then s.dataintegrity end) as fqe_3004_cd_lr_qual,
    MAX(case when t.id = 641 then s.floatvalue end) as at_3005,
    MAX(case when t.id = 641 then s.dataintegrity end) as at_3005_qual,
    MAX(case when t.id = 647 then s.floatvalue end) as ft_3004_scfm,
    MAX(case when t.id = 647 then s.dataintegrity end) as ft_3004_scfm_qual,
    MAX(case when t.id = 934 then s.floatvalue end) as ft_3005_scfm,
    MAX(case when t.id = 934 then s.dataintegrity end) as ft_3005_scfm_qual
FROM sqlt_data_1_2019_10 s
    inner join sqlth_te t
    on s.tagid = t.id
WHERE
    (s.floatvalue AND s.dataintegrity) IS NOT NULL
    AND 
    (t_stamp >= 1570597200000 and t_stamp <= 1570629600000)
    AND 
    (tagid = 934
    or tagid = 647
    or tagid = 622
    or tagid = 641
    or tagid = 460
    or tagid = 481)
GROUP BY FROM_UNIXTIME(t_stamp/1000, '%b %D, %Y %h:%i %p')
ORDER BY t_stamp ASC

同樣正如 Gordon Linoff 評論的那樣,請注意 WHERE 子句中 tagid 的條件最好寫成:

tag_id IN (934, 647, 622, 641, 460, 481)

編輯:

由於我提出了這個主題,因此where子句應如下所示:

WHERE s.floatvalue IS NOT NULL AND
      s.dataintegrity IS NOT NULL AND
      t_stamp >= 1570597200000 AND
      t_stamp <= 1570629600000 AND
      tagid IN (934, 647, 622, 641, 460, 481)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM