Postgresql
在滿足條件之前選擇組內的行
我想根據時間條件選擇每個組中的行。我
trajectory_data
在 PostgreSQL 10 中有下表,其中包含每組的每日積分。| traj_id | timestamp | height | lat | Lon | |---------|------------|--------|-------|--------| | 1 | 2006-01-01 | 10 | 34.55 | -70.80 | | 1 | 2006-01-02 | 9 | 34.56 | -70.88 | | 1 | 2006-01-03 | 0 | 34.56 | -70.89 | | 1 | 2006-01-04 | 5 | 34.57 | -70.90 | | 1 | 2006-01-05 | 20 | 34.60 | -70.94 | | 2 | 2006-01-01 | 10 | 34.55 | -70.80 | | 2 | 2006-01-02 | 5 | 34.55 | -70.82 | | 2 | 2006-01-03 | 3 | 34.54 | -70.89 | | 2 | 2006-01-04 | 0 | 34.53 | -70.90 | | 2 | 2006-01-05 | 10 | 34.51 | -70.95 | | 3 | 2006-01-01 | 10 | 34.55 | -70.80 | | 3 | 2006-01-01 | 9 | 34.56 | -70.75 | | 3 | 2006-01-01 | 11 | 34.54 | -70.90 | | 3 | 2006-01-01 | 15 | 34.60 | -70.95 | | 3 | 2006-01-01 | 30 | 34.67 | -70.90 |
我想過濾數據以獲取每個組中高度大於零的行。但是,這並不像使用
WHERE
語句刪除零那麼簡單。我想保持組第一次達到零之前的所有行:| traj_id | timestamp | height | lat | Lon | |---------|------------|--------|-------|--------| | 1 | 2006-01-01 | 10 | 34.55 | -70.80 | | 1 | 2006-01-02 | 9 | 34.56 | -70.88 | | 2 | 2006-01-01 | 10 | 34.55 | -70.80 | | 2 | 2006-01-02 | 5 | 34.55 | -70.82 | | 2 | 2006-01-03 | 3 | 34.54 | -70.89 | | 3 | 2006-01-01 | 10 | 34.55 | -70.80 | | 3 | 2006-01-01 | 9 | 34.56 | -70.75 | | 3 | 2006-01-01 | 11 | 34.54 | -70.90 | | 3 | 2006-01-01 | 15 | 34.60 | -70.95 | | 3 | 2006-01-01 | 30 | 34.67 | -70.90 |
在此範例中,組 1 和 2 被過濾,並且零之後的行被刪除。
我知道我可以執行類似的東西:
SELECT * FROM trajectory_data GROUP BY traj_id HAVING height > 0
但是,此查詢將保留我不一定想要的行(即組已經達到零的行),並且我無意聚合數據,只需選擇行。還有另一種解決方法嗎?
子查詢中的單個視窗函式應該可以解決問題:
SELECT * FROM ( SELECT *, count(*) FILTER (WHERE height = 0) OVER (PARTITION BY traj_id ORDER BY timestamp) AS ct0 FROM trajectory_data ) sub WHERE ct0 = 0;
這會計算
0
每個 沿時間線的出現次數traj_id
,並且僅在第一個彈出之前保留行。瞧。db<>在這裡擺弄
有關的: