我有一个具有以下结构的表,其中除最后一列之外的所有列均非空:
ID | 接收者 | 发送时间 | 接收时间 |
---|---|---|---|
1 | A | 00:00:00 | 00:00:01 |
2 | A | 00:00:01 | 无效的 |
3 | A | 00:00:02 | 无效的 |
4 | A | 00:00:03 | 无效的 |
5 | A | 00:00:04 | 00:00:05 |
6 | 乙 | 00:00:00 | 00:00:01 |
7 | 乙 | 00:00:01 | 无效的 |
8 | 乙 | 00:00:02 | 00:00:03 |
9 | A | 00:00:05 | 无效的 |
10 | 乙 | 00:00:03 | 无效的 |
11 | A | 00:00:06 | 00:00:07 |
我想选择(并最终删除,但我认为选择是第一步)所有行,其中列recv_time
用于NULL
n或更多连续行,按receiver
列分区并按send_time
列排序。
因此,从上面的示例中,如果n=2,我想选择/删除 ID 为 2、3 和 4 的行,但不是第 7、9 或 10 行。
我认为需要带有分区的计数,但我不知道如何在遇到非空行时“重置”空值的计数。这是我到目前为止所得到的:
SELECT
id, receiver, send_time, recv_time,
COUNT(CASE WHEN recv_time IS NULL THEN 1 END) OVER (PARTITION BY receiver ORDER BY send_time)
FROM test
ORDER BY id
这给了我:
ID | 接收者 | 发送时间 | 接收时间 | 数数 |
---|---|---|---|---|
1 | A | 00:00:00 | 00:00:01 | 0 |
2 | A | 00:00:01 | 无效的 | 1 |
3 | A | 00:00:02 | 无效的 | 2 |
4 | A | 00:00:03 | 无效的 | 3 |
5 | A | 00:00:04 | 00:00:05 | 3 |
6 | 乙 | 00:00:00 | 00:00:01 | 0 |
7 | 乙 | 00:00:01 | 无效的 | 1 |
8 | 乙 | 00:00:02 | 00:00:03 | 1 |
9 | A | 00:00:05 | 无效的 | 4 |
10 | 乙 | 00:00:03 | 无效的 | 2 |
11 | A | 00:00:06 | 00:00:07 | 4 |
但我希望计数在第 5、8、11 行重置。我也不确定之后如何继续,因为我想捕获连续 NULL 行“组”中的所有行,但显然计数本例中的第 2 行小于n。