簡體   English   中英

聚合 SQL 中缺少布爾值的行

[英]Aggregating rows in SQL with missing Booleans

我有以下 SQL 腳本,它從PostgreSQL數據庫視圖表中返回以下數據。

SELECT 
  "V_data".macaddr,
  "V_data".sensorid,
  "V_data".ts,
  "V_data".velocity,
  "V_data".temp,
  "V_data".highspeed,
  "V_data".hightemp,
  "V_data".distance,

FROM 
  sensordb."V_data"

WHERE 
  "V_data".macaddr like '%abcdef'

AND
  (
  ("V_data".sensorid = 'abc1') or ("V_data".sensorid = 'a2bc') or ("V_data".sensorid = 'ab3c') 
  )

AND
  "V_data".ts >= 1616370867000

ORDER BY
  "V_data".ts DESC;

Output

macaddr 感應器 ts 速度 溫度 高速 高溫 距離
abcdef abc1 1616370867010 25 32 52
abcdef a2bc 1616370867008 27 35 51
abcdef ab3c 1616370867006 26 30 50
abcdef abc1 1616370867005 24 36 50
abcdef a2bc 1616370867004 27 31 50
abcdef abc1 1616370867002 21 30 48
abcdef ab3c 1616370867000 22 33 F 46

我想聚合這些行,以便我擁有每個 sensorid 的 ts、速度、溫度、距離的最新讀數。 對於布爾高速和高溫,如果沒有可用的 Boolean 值,我想要最新的可用 Boolean 值或空單元格。

預期 output

macaddr 感應器 ts 速度 溫度 高速 高溫 距離
abcdef abc1 1616370867010 25 32 52
abcdef a2bc 1616370867008 27 35 51
abcdef ab3c 1616370867006 26 30 F 50

我怎樣才能簡化這個任務?

謝謝。

嗯。 . . 對於除 boolean 列之外的所有列DISTINCT ON都可以。 但是這些布爾值很棘手。 可以在布爾值上使用一些技巧。

相反,讓我們對ROW_NUMBER()使用 go 來獲取最新的行。 並擺弄 arrays 以獲得最新的 boolean 值:

SELECT d.macaddr, d.sensorid,
       MAX(d.ts) as ts,
       MAX(d.velocity) FILTER (WHERE seqnum = 1) as velocity,
       MAX(d.temp) FILTER (WHERE seqnum = 1) as temp,
       (ARRAY_REMOVE(ARRAY_AGG(d.highspeed ORDER BY ts DESC), NULL))[1] as highspeed,
       (ARRAY_REMOVE(ARRAY_AGG(d.hightemp ORDER BY ts DESC), NULL))[1] as hightemp
       MAX(d.distance) FILTER (WHERE seqnum = 1)
FROM (SELECT d.*,
             ROW_NUMBER() OVER (PARTITION BY d.macaddr, d.sensorid ORDER BY ts DESC) as seqnum
      FROM sensordb."V_data" d
      WHERE d.macaddr like '%abcdef' AND
            d.sensorid IN ('abc1', 'a2bc', 'ab3c') AND
            d.ts >= 1616370867000
     ) d
GROUP BY d.macaddr, d.sensorid
ORDER BY d.ts DESC;

您可以使用DISTINCT ON (僅在 PostgreSQL afaik 中可用)來簡化此查詢。 你可以做:

with
q as (
  -- your query here
)
select 
  l.macaddr, l.sensorid, l.ts, l.velocity, l.temp,
  s.highspeed, t.hightemp, 
  l.distance  
from (
  select distinct on (sensorid) *
  from q
  order by sensorid, ts desc
) l
left join (
  select distinct on (sensorid) *
  from q
  where highspeed is not null
  order by sensorid, ts desc
) s on s.sensorid = l.sensorid
left join (
  select distinct on (sensorid) *
  from q
  where hightemp is not null
  order by sensorid, ts desc
) t on t.sensorid = l.sensorid

暫無
暫無

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

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