這里有張桌子:
| ID | 方向 ID | created_at |
|---|---|---|
| 1 | 2 | 2021 年 11 月 22 日 – 16:00:00 |
| 2 | 2 | 2021 年 11 月 22 日 – 16:20:00 |
| 43 | 2 | 2021 年 11 月 22 日 – 16:25:00 |
| 455 | 1 | 2021 年 11 月 22 日 – 16:27:00 |
| 6567 | 2 | 2021 年 11 月 22 日 – 17:36:00 |
| 674556 | 2 | 2021 年 11 月 22 日 – 20:01:00 |
| 5243554 | 1 | 2021 年 11 月 22 日 – 20:50:00 |
| 5243554 | 1 | 2021 年 11 月 22 日 – 21:46:00 |
我需要得到以下結果:
| 1 | 2 | created_at_by_hour |
|---|---|---|
| 1 | 3 | 22.11.21 17 |
| 1 | 4 | 22.11.21 18 |
| 1 | 4 | 22.11.21 19 |
| 1 | 4 | 22.11.21 20 |
| 2 | 5 | 22.11.21 21 |
| 3 | 5 | 22.11.21 22 |
direction_id表頭中的 1 和 2 是表中的所有可能值。
created_at減少到小時,您需要計算有多少記錄滿足條件 <= created_at_by_hour。但是分組應該是這樣的,如果沒有創建記錄的時間(小時),那么只需復制前一小時。
該表由三個欄位組成 - id(int)、direction_id(int)、created_at(timestamptz)。我需要使用在此“分組”時間之前創建的記錄數獲取每小時(基于 created_at 欄位)資料上傳。但我不僅需要數字,還需要每個數字direction_id(只有兩個 -1和2)。如果direction_id在某個時間沒有為某個特定創建記錄,則復制前一個,但結果應在最后一個created_at. created_at是創建記錄的時間。
uj5u.com熱心網友回復:
在我看來,最好根據一個小時在最小和最大日期之間生成一個日期,然后計算每個方向的計數。
演示
with time_range as (
select
min(created_at) interval '1 hour' as min,
max(created_at) interval '1 hour' as max
from test
)
select
count(*) filter (where direction_id = 1) as "1",
count(*) filter (where direction_id = 2) as "2",
to_char(gs.hour, 'dd.mm.yy HH24') as created_at_by_hour
from
test t
cross join time_range tr
inner join generate_series(tr.min, tr.max, interval '1 hour') gs(hour)
on t.created_at <= gs.hour
group by gs.hour
order by gs.hour
uj5u.com熱心網友回復:
將日期截斷到小時,按它分組并計數。然后用于SUM OVER獲取計數的運行總數。為了在表中顯示缺失的小時數,您必須生成一系列小時數并外部連接您的資料。
with hourly as
(
select date_trunc('hour', created_at) as hour, direction_id from mytable
)
, hours(hour) as
(
select *
from generate_series
(
(select min(hour) from hourly), (select max(hour) from hourly), interval '1 hour'
)
)
select
hours.hour,
sum(count(*) filter (where hourly.direction_id = 1)) over (order by hour) as "1",
sum(count(*) filter (where hourly.direction_id = 2)) over (order by hour) as "2"
from hours
left join hourly using (hour)
group by hour
order by hour;
演示:https : //dbfiddle.uk/?rdbms=postgres_14&fiddle=21d0c838452a09feac4ebc57906829f4
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/363749.html
標籤:sql PostgreSQL的
下一篇:如何選擇_和a之間的列的一部分
