【发布时间】:2021-10-31 09:22:48
【问题描述】:
我需要删除数据集中的一些行,其中speed 等于零并持续 N 次(假设 N 为 2)。
表demo 的结构如下:
| id | car | speed | time |
|---|---|---|---|
| 1 | foo | 0 | 1 |
| 2 | foo | 0 | 2 |
| 3 | foo | 0 | 3 |
| 4 | foo | 1 | 4 |
| 5 | foo | 1 | 5 |
| 6 | foo | 0 | 6 |
| 7 | bar | 0 | 1 |
| 8 | bar | 0 | 2 |
| 9 | bar | 5 | 3 |
| 10 | bar | 5 | 4 |
| 11 | bar | 5 | 5 |
| 12 | bar | 5 | 6 |
然后我希望使用window_function生成如下表:
| id | car | speed | time | lasting |
|---|---|---|---|---|
| 1 | foo | 0 | 1 | 3 |
| 2 | foo | 0 | 2 | 3 |
| 3 | foo | 0 | 3 | 3 |
| 4 | foo | 1 | 4 | 2 |
| 5 | foo | 1 | 5 | 2 |
| 6 | foo | 0 | 6 | 1 |
| 7 | bar | 0 | 1 | 2 |
| 8 | bar | 0 | 2 | 2 |
| 9 | bar | 5 | 3 | 4 |
| 10 | bar | 5 | 4 | 4 |
| 11 | bar | 5 | 5 | 4 |
| 12 | bar | 5 | 6 | 4 |
然后我可以使用WHERE NOT (speed = 0 AND lasting > 2)轻松排除这些行
把我试过的代码放在这里,但它没有返回我期望的值,我猜那些FROM (SELECT ... FROM (SELECT ...可能不是解决问题的最佳实践:
SELECT g3.*, count(id) OVER (PARTITION BY car, cumsum ORDER BY id) as num
FROM (SELECT g2.*, sum(grp2) OVER (PARTITION BY car ORDER BY id) AS cumsum
FROM (SELECT g1.*, (CASE ne0 WHEN 0 THEN 0 ELSE 1 END) AS grp2
FROM (SELECT g.*, speed - lag(speed, 1, 0) OVER (PARTITION BY car) AS ne0
FROM (SELECT *, row_number() OVER (PARTITION BY car) AS grp FROM demo) g ) g1 ) g2 ) g3
ORDER BY id;
【问题讨论】:
标签: postgresql count where-clause window-functions