如何查詢數據中的時間片,當時間片的時間片大於所需的時間片。最終結果將用於繪製堆積的條形圖。如何查詢DB時間片大於所需時間片的時間序列數據?
實施例的數據:使用的時間片100 「單元」
START_TS (int)| END_TS (int) | DATA (int) | GROUP
-----------------------------------
0 | 179 | 2000 | G1
180 | 499 | 1000 | G2
500 | 699 | 1000 | G1
845 ...
求購輸出。輸出中不需要End_ts,但有助於理解計算。
START_TS | END_TS | DATA (equation = amount in that time slice) | GROUP
-------------------------------------------------------
0 | 99 | (2000/180) * 100 = 1111 | G1
100 | 199 | (2000/180) * 80 = 889 | G1
100 | 199 | (1000/320) * 20 = 63 | G2
200 | 299 | (1000/320) * 100 = 313 | G2
300 | 399 | (1000/320) * 100 = 313 | G2
400 | 499 | (1000/320) * 100 = 313 | G2
從這裏得到時間序列是這樣的。
SELECT (startts/100)*100, ...
FROM TABLE
FULL JOIN
(SELECT startts from generate_series(0,700,100) startts) s1
USING (startts)
GROUP BY startts/100
因此,這將是這樣的(沒有GROUP BY)
STARTTS | ENDTS | DATA | GROUP
0 | 179 | 2000 | G1
100 |
180 | 499 | 1000 | G2
200 |
300 |
400 |
500 | 699 | 1000 | G1
600 |
700
但我怎麼分割中的數據具有兩個或多個生成的行(時間片行),在計算時間切片。
**這基本上起作用,但對大數據集沒有真正的功能。行像1-100M行。
下面是該查詢做一些+更多的不重疊的時間片
SELECT (start_ts/100)*100 as start_ts, sum(part) as data, cgroup
FROM (
SELECT *, (data * (overlap_end-overlap_start + 1)/(end_ts - tts + 1)) as part
FROM
(
SELECT (case when s1.start_ts > t.start_ts then s1.start_ts else t.start_ts end) as overlap_start,
(case when s1.start_ts+100 < t.end_ts then s1.start_ts+100-1 else t.end_ts end) as overlap_end,
t.start_ts as tts, s1.start_ts as start_ts, t.end_ts, cgroup, data
FROM (SELECT start_ts from generate_series(0,800,100) start_ts) s1
LEFT OUTER JOIN test t on t.start_ts < s1.start_ts+100 and t.end_ts >= s1.start_ts
) t
) t2
GROUP BY start_ts/100, cgroup
你有一個 '重複' 所需的行('START_TS = 100,END_TS = 199') - 你想這與其他部分進行彙總?另外,你知道你所做的任何分割都將完全捏造/平均,對嗎?因爲在他們最初發生的時間片中你不知道_when_;這就像一個遊客想知道爲什麼指導手冊說'帶上外套',當年的平均溫度是90°F - 這只是一年中的40°F的一天。通常最好從原始數據構建這種東西 - 它是否可用? –
是的,我想在「100」片段中有兩個start_ts值,因爲它們將顯示該片段中的每個組值。我知道它會製作/平均結果,但這是現在想要的功能。我正在繪製堆疊條或實際堆疊的線條圖,其中每條線都是1像素寬,並與該切片中的所有組進行堆疊。原始數據可能會在周圍,但只有在達到某個縮放級別後才能使用,並且不在此問題中。 –