2017-07-12 41 views
0

我想寫一個Postgres sql,它會讓我在特定時間戳的30分鐘內的航班。Postgres sql查詢大約30分鐘內的時間戳內沒有記錄

我的SQL是這樣的:

「選擇計數從lk_merged(不同(gufi))作爲No_of_airplanes一個 其中(a.on_actual(a.on_actual之間 - (20 *間隔 '1 MINUTE'))和(a.on_actual +(40 *間隔'1分鐘'))) group by a.on_actual「

請建議如何獲得飛機的no。

我的表格有gufi作爲飛機ID on_actual_timelanding。

我有: gufi(plane_id),時間
3432343,12:33:89
2565656,12:44:45
3242234,1:05:23

輸出應該像,用新的柱表明no_of_planes_around 20分鐘內之前和時間戳

Gufi(plane_id),時間標記後,No_of平面角落找尋
3432343,12:33:89,1
2565656,12點44分: 2,
3242234,1:05:23,1

如果可能,請不要自行加入。

感謝 愛特亞吉

+2

示例數據和期望的輸出將會有所幫助 –

+0

您向我們展示了您嘗試過的SQL。你能告訴我們爲什麼這不起作用,它給你什麼,以及你希望它給你什麼?另外,你試過的其他東西。 – jmelesky

+0

嗨,歡迎來到Stack Overflow,請花點時間閱讀[歡迎導覽](https://stackoverflow.com/tour)以瞭解您在這裏的方式(並獲得您的第一張徽章),請閱讀如何創建一個[Minimal,Complete和Verifiable示例](https://stackoverflow.com/help/mcve)並檢查[如何提出好問題](https://stackoverflow.com/help/how-to-ask ),所以你增加了獲得反饋和有用答案的機會。 – DarkCygnus

回答

0

II是不可能的,如果使用COUNT()作爲窗口函數使用COUNT(DISTINCT ...),如果你嘗試,你得到這個錯誤「0A000:DISTINCT不實現窗口功能「。因此,爲了讓這個計數具有不同的計算結果,並在輸出的每一行上輸出,我建議使用CROSS JOIN LATERAL。

注意我不確定你的數據是1:05:23 = 01:05:23還是13:05:23的小例子,所以我同時包含了這兩個數據。

CREATE TABLE mytable(
    plane_id INTEGER NOT NULL 
    ,plane_time TIME NOT NULL 
) 
\\ 
INSERT INTO mytable(plane_id,plane_time) VALUES (3432343,TO_TIMESTAMP('12:33:89', 'HH24:MI:SS')::TIME)\\ 
INSERT INTO mytable(plane_id,plane_time) VALUES (2565656,TO_TIMESTAMP('12:44:45', 'HH24:MI:SS')::TIME)\\ 
INSERT INTO mytable(plane_id,plane_time) VALUES (3242234,TO_TIMESTAMP('01:05:23', 'HH24:MI:SS')::TIME)\\ 
INSERT INTO mytable(plane_id,plane_time) VALUES (3242234,TO_TIMESTAMP('13:05:23', 'HH24:MI:SS')::TIME)\\ 

select * 
from mytable t1 
cross join lateral (
    select count(distinct plane_id) No_of_planes_around 
    from mytable t2 
    where t2.plane_time between t1.plane_time - interval '20 minutes' and t1.plane_time + interval '40 minutes' 
    --and t1.plane_id <> t2.plane_id 
    ) cjl 
\\ 

而且我不知道,如果計數應該包括當前行的平面或不那麼我把它,但你可以通過該行排除「和t1.plane_id <> t2.plane_id 「在查詢中處於活動狀態。

相關問題