[英]Exclude rows that come before a specific column value in group SQL Teradata
我在 Teradata 中有以下結構的表。 我的分析在數據上傳后即開始,即 STATUS 列中的狀態為“已上傳”。 我想排除每個組中 STATUS 變為“已上傳”之前的行。 所有事件都是實時發生的,即每個新事件的時間戳值都會增加。
輸入表數據--> table_input
ID STATUS TMP
A1 UPLOADED 06/16/2021 08:38:44.535
A1 A 06/16/2021 16:20:40.014
A1 (B) 06/16/2021 17:15:36.488
A1 C 06/16/2021 17:15:36.846
A1 A 06/16/2021 17:15:36.883
B1 A2 06/16/2021 08:34:09.974
B1 L 06/16/2021 08:34:10.271
B1 L 06/16/2021 14:44:33.677
B1 (R) 06/16/2021 14:52:21.812
B1 UPLOADED 06/16/2021 16:05:36.346
B1 AP 06/16/2021 16:05:36.499
B1 (R) 06/16/2021 16:05:36.718
C1 C 06/16/2021 16:05:36.764
C1 UPLOADED 06/16/2021 08:49:43.796
C1 UPLOADED 06/16/2021 08:49:43.841
C1 L 06/16/2021 14:50:39.667
C1 UPLOADED 06/16/2021 14:52:50.149
C1 (R) 06/16/2021 16:05:43.998
預期輸出:從結果中排除狀態為“已上傳”之前的數據。
ID STATUS TMP
A1 UPLOADED 06/16/2021 08:38:44.535
A1 A 06/16/2021 16:20:40.014
A1 (B) 06/16/2021 17:15:36.488
A1 C 06/16/2021 17:15:36.846
A1 A 06/16/2021 17:15:36.883
B1 UPLOADED 06/16/2021 16:05:36.346
B1 AP 06/16/2021 16:05:36.499
B1 (R) 06/16/2021 16:05:36.718
C1 UPLOADED 06/16/2021 08:49:43.796
C1 UPLOADED 06/16/2021 08:49:43.841
C1 L 06/16/2021 14:50:39.667
C1 UPLOADED 06/16/2021 14:52:50.149
C1 (R) 06/16/2021 16:05:43.998
我正在使用 Teradata SQL,但 SQL Server SQL 也應該可以工作。 我正在嘗試使用窗口函數,但還沒有取得任何成功。 我們還可以將 TMP 列與 TimeStamp 一起使用,並編寫一個邏輯,例如排除 TimeStamp 值小於“UPLOADED”第一次出現的 TimeStamp 的所有行。
您可以在 Teradata 中使用qualify
子句:
select t.*
from t
qualify tmp >= min(case when status = 'UPLOADED' then tmp end) over (partition by id);
而且,雖然您可以為此使用窗口函數,但也可以使用相關子查詢來編寫它:
select t.*
from t
where t.tmp > (select min(t2.tmp)
from t t2
where t2.id = t.id and t2.status = 'UPLOADED'
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.