Postgresql

在滿足條件之前選擇組內的行

  • December 4, 2019

我想根據時間條件選擇每個組中的行。我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<>在這裡擺弄

有關的:

引用自:https://dba.stackexchange.com/questions/254811