2017-07-07 62 views
0

內創建條件布爾列我有以下SQL代碼:的PostgreSQL如何查詢

SELECT sensor_id, reader_id, rssi, date_time, time_diff_lead, reader_diff 
FROM  
    (
    SELECT doc->>'sensorId' as sensor_id, doc->>'readerId' as reader_id, (doc->>'rssi')::int as rssi, created_at as date_time, 
    EXTRACT(EPOCH FROM lead(created_at) OVER w - created_at) as time_diff_lead, 
    (lead(doc->>'readerId') OVER w)::int - (doc->>'readerId')::int as reader_diff 
    FROM public.sensor_data 
    WINDOW w AS (PARTITION BY doc->>'sensorId' ORDER BY created_at) 
    ) as x 
WHERE rssi > 380 OR time_diff_lead > 18.0 AND reader_diff = 0 
ORDER BY sensor_id, date_time 

WHERE子句定義,我想用它來創建一個布爾值列的條件。

所有這些數據來自一個jsonB列的表和效率(我認爲...)我需要通過正確的鍵將該列添加到該表。

該表將至少每30秒更新一次新記錄。上面的查詢將比這個運行次數少。所以這個列中會有空值。在一般意義上,這將如何影響對該表的查詢? (數據科學新手)

我正在啓動並試圖爲我們的數據收集打下基礎(並且他們讓我這樣做:P),所以請撕開我的代碼並指出我更好的方法!

+1

既然您提到了基金會,請參閱https://en.wikipedia.org/wiki/Database_normalization。除了使用jsonb而不是普通列以外,如果您關心的是正常表單,那麼您提到的其他bool列是非啓動器。 –

+0

{sensor_id,reader_id}確實看起來像這張表的自然鍵(的一部分),所以它們應該被保留在json-blob之外。 #2nf – joop

+0

@DanielVérité非常感謝,正是我想聽到的東西的類型:) 我沒有製作數據庫或表格,它是一個混亂,需要清理。目前,json沒有時間戳記密鑰,所以我使用created_at列只是爲了獲取邏輯(將有一個時間戳記密鑰)。 我還使用了一個JOIN與sensor_id和reader_id(來自public.sensor_data)在一個沒有jsonB(other_schema.other_table)表的普通列上。 我們使用jsonB的原因是我們所有的數據都是從源代碼構建的JSON對象。你對jsonB的看法和加入正常的列 –

回答

1

的條件一個boolean類型,所以你可以選擇從布爾條件獲得的價值,並給它一個別名:


SELECT sensor_id, reader_id, rssi, date_time 
, time_diff_lead, reader_diff 
, (rssi > 380 OR time_diff_lead > 18.0 AND reader_diff = 0) AS bull 
FROM (
    SELECT doc->>'sensorId' as sensor_id, doc->>'readerId' as reader_id 
    , (doc->>'rssi')::int as rssi, created_at as date_time 
    , EXTRACT(EPOCH FROM lead(created_at) OVER w - created_at) as time_diff_lead 
    , (lead(doc->>'readerId') OVER w)::int - (doc->>'readerId')::int as reader_diff 
    FROM public.sensor_data 
    WINDOW w AS (PARTITION BY doc->>'sensorId' ORDER BY created_at) 
    ) as x 
ORDER BY sensor_id, date_time 
; 

[更新]使用計算列將需要將條件拖到主查詢中。

+0

謝謝,我覺得自己像一個白癡沒有嘗試過這種方式! –