我想从表中选择所有行,直到(包括)每个分区达到某个值。在这种情况下,当status最后一次为'b'时,每个id前面的所有行。注意:时间戳按id
的顺序排列。<表类>id 名称 地位地位时间戳 tbody><<tr>1 Sta 打开 10:50:09.000000 1丹尼 打开 c 10:50:19.000000 1Elle 关闭道明> 10:50:39.000000 2安东 关闭 16:00:09.000000 2吉尔 做 b 16:00:19.000000 2汤姆 打开 b 16:05:09.000000 2比尔 打开 c 16:07:09.000000 3 安 做 b 08:00:13.000000 3 孙燕姿 做 b 08:12:13.000000 3 马丁 打开 b 08:25:13.000000 3 杰夫 打开 09:00:13.000000 3 《路加福音》 打开 c 09:07:13.000000 3 凯伦 打开 c 09:15:13.000000 3 露西 打开 10:00:13.000000 表类>
当status最后一次出现值'b'时,每个id前面的所有行与相同第一次出现值'b'之前的行当您恢复排序顺序时:
SELECT *
FROM tab
QUALIFY -- tag the last 'b'
Count(CASE WHEN status = 'b' THEN 1 end)
Over (PARTITION BY id
ORDER BY timestamp DESC
ROWS Unbounded Preceding) > 0
ORDER BY id, timestamp
;
这将不会返回不存在'b'的id。
如果您也想返回这些,请添加另一个条件来限定:
OR -- no 'b' found
Count(CASE WHEN status = 'b' THEN 1 end)
Over (PARTITION BY id) = 0
由于两个计数共享同一个分区,因此在Explain中仍然是单个STAT步骤。