抱歉,如果標題不清楚,這個問題很難表述。
我有一個資料集,它描述了足球運動員在各種比賽中隨著時間的推移在球場上的位置。我試圖查詢的表有一frame_id列是遞增計數器,每秒有 10 幀。
該表還有一event列,用于描述可能在該幀發生的事件,例如ball_snap或kick_received。在一場比賽的程序中,其中一些事件可以保證以特定的順序發生。
我想找到兩個事件之間發生的幀。
如果我想frame_id在不同列中定義的兩個事件之間獲得一組有序的s,我將如何處理?
我的第一次嘗試是:
select game_id, play_id, min(frame_id) as snap_frame, max(frame_id) as tackle_frame
from tracking
where event = 'ball_snap'
or event = 'tackle'
group by game_id, play_id;
但這不起作用。我似乎遇到了一些未定義的行為,這對某些記錄有效,但對其他記錄無效
編輯以包含一些資料
CSV:https : //gist.github.com/bholzer/bae669a6e70f68807717f79a66af7a54
| 游戲編號 | play_id | frame_id | 事件 |
|---|---|---|---|
| 10 | 20 | 10 | |
| 10 | 20 | 11 | ball_snap |
| ... | ... | ... | ... |
| 10 | 20 | 77 | |
| 10 | 20 | 78 | punt_received |
我想要一個查詢,可以獲取此資料中第 11 幀和第 78 幀之間的所有內容
uj5u.com熱心網友回復:
您的帖子中有兩個不同的問題:
If I want to get an ordered set of frame_ids, between two events defined in a different column, how would I go about that?
據我了解你的tracking表結構,相同的事件名稱會出現在表的多行中,因為它在游戲程序中可能發生多次,所以你不能使用列event來識別一個特定事件發生在一個時間,因此,您不能選擇僅以其名稱為特征的兩個事件之間的所有事件。
我想要一個查詢,可以獲取此資料中第 11 幀和第 78 幀之間的所有內容
如果我們假設 frame_id 值是根據時間線排序的,那么實作這一點的查詢是:
SELECT * FROM tracking WHERE frame_id BETWEEN 11 AND 78
uj5u.com熱心網友回復:
有很多方法可以解決它,其中之一是使用 EXISTS 運算子:
SELECT *
FROM tracking t
WHERE EXISTS (
SELECT 1 FROM tracking te
WHERE t.game_id = te.game_id
AND t.play_id = te.play_id
AND te.event IN ('ball_snap', 'punt_received')
HAVING t.frame_id > MIN(te.frame_id) AND t.frame_id < MAX(te.frame_id)
)
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/343267.html
標籤:sql PostgreSQL
上一篇:如何在PostgreSQL的頂級(父級)級別設定Where子句?
下一篇:使用postgresql查詢遞回
