Teradata/SQL,在每个分区达到某个值之前选择所有行

  • 本文关键字:选择 SQL Teradata 分区 sql teradata
  • 更新时间 :
  • 英文 :


我想从表中选择所有行,直到(包括)每个分区达到某个值。在这种情况下,当status最后一次为'b'时,每个id前面的所有行。注意:时间戳按id

的顺序排列。
<表类>id名称地位地位时间戳tbody><<tr>1Sta打开10:50:09.0000001丹尼打开c10:50:19.0000001Elle关闭道明>10:50:39.0000002安东关闭16:00:09.0000002吉尔做b16:00:19.0000002汤姆打开b16:05:09.0000002比尔打开c16:07:09.0000003安做b08:00:13.0000003孙燕姿做b08:12:13.0000003马丁打开b08:25:13.0000003杰夫打开09:00:13.0000003《路加福音》打开c09:07:13.0000003凯伦打开c09:15:13.0000003露西打开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步骤。

最新更新