我發現自己處於必須制定(對我而言)相當複雜的SQL查詢的位置,而且我似乎無法控制它。使用PostgreSQL查詢生成具有日常統計信息的時間序列
我有一個名爲orders
的表格和一個相關表格order_state_history
,它記錄了這些訂單隨時間的狀態(見下文)。
我現在需要生成一系列行 - 每天一行 - 包含當天結束時處於特定狀態的訂單數量(請參閱report
)。另外我想只考慮order.type = 1
的訂單。
數據駐留在PostgreSQL數據庫中。我已經找到了如何使用GENERATE_SERIES(DATE '2001-01-01', CURRENT_DATE, '1 DAY'::INTERVAL) days
來生成時間序列,該序列允許我在沒有記錄狀態變化的日子生成行。
我目前的做法是加入orders
,order_state_history
而產生的一系列days
一起,試圖篩選出所有具有DATE(order_state_history.timestamp) > DATE(days)
然後first_value(order_state_history.new_state) OVER (PARTITION_BY(orders.id) ORDER BY order_state_history.timestamp DESC)
某種方式得到在這一天每個訂單的最終狀態行,但這是我微小的SQL經驗拋棄了我的地方。
我只是無法用頭來解決問題。
這甚至可以在單個查詢中解決,還是我最好提供建議,以通過某種智能腳本來計算數據,該腳本每天執行一個查詢? 什麼將是一個合理的方法來解決這個問題?
orders===
id type
10000 1
10001 1
10002 2
10003 2
10004 1
order_state_history===
order_id index timestamp new_state
10000 1 01.01.2001 12:00 NEW
10000 2 02.01.2001 13:00 ACTIVE
10000 3 03.01.2001 14:00 DONE
10001 1 02.01.2001 13:00 NEW
10002 1 03.01.2001 14:00 NEW
10002 2 05.01.2001 10:00 ACTIVE
10002 3 05.01.2001 14:00 DONE
10003 1 07.01.2001 04:00 NEW
10004 1 05.01.2001 14:00 NEW
10004 2 10.01.2001 17:30 DONE
Expected result===
date new_orders active_orders done_orders
01.01.2001 1 0 0
02.01.2001 1 1 0
03.01.2001 1 0 1
04.01.2001 1 0 1
05.01.2001 2 0 1
06.01.2001 2 0 1
07.01.2001 2 0 1
08.01.2001 2 0 1
09.01.2001 2 0 1
10.01.2001 1 0 2
請檢查預期結果(爲什麼03.01有2個新訂單?),並添加下一個預期行,直到05.01至少。 – klin
我添加了所有相關的行。 03.01。有兩個新訂單,因爲在兩個02.01。和03.01。有新訂單(10001和10002)。訂單10001 **在新的狀態下保持**,因此在接下來的所有日子都會計入。計數是總計,結果行'new_orders'計算在一天結束時處於NEW狀態的所有訂單,無論其狀態是否更改。 –
但是10002是2類的,所以不應該被計算在內? – klin