我有一個類似于下面的表格。我的目標是洗掉狀態變為“已取消”或“失敗”的每個日期的組,同時每天保留包含其他狀態更改的組。
| 團體 | 地位 | 日期 |
|---|---|---|
| 一個 | 待辦的 | 2021-01-01 08:00:00 |
| 一個 | 取消 | 2021-01-01 13:00:00 |
| 一個 | 待辦的 | 2021-01-02 08:00:00 |
| 一個 | 失敗的 | 2021-01-02 13:00:00 |
| 一個 | 待辦的 | 2021-01-03 08:00:00 |
| 一個 | 待結算 | 2021-01-03 13:00:00 |
| 一個 | 待辦的 | 2021-01-04 08:00:00 |
| 一個 | 落戶 | 2021-01-04 13:00:00 |
| 乙 | 待辦的 | 2021-01-01 08:00:00 |
| 乙 | 取消 | 2021-01-01 13:00:00 |
| 乙 | 待辦的 | 2021-01-02 08:00:00 |
| 乙 | 失敗的 | 2021-01-02 13:00:00 |
| 乙 | 待辦的 | 2021-01-03 08:00:00 |
| 乙 | 待結算 | 2021-01-03 13:00:00 |
| 乙 | 待辦的 | 2021-01-04 08:00:00 |
| 乙 | 落戶 | 2021-01-04 13:00:00 |
我的第一次嘗試是這樣的:
select GROUP, STATUS, DATE
from TABLE TBL
, (
select GROUP, STATUS, DATE
from TABLE
where STATUS in ('Cancelled','Failed')
) FLAG
where (TBL.GROUP <> FLAG.GROUP and TBL.DATE <> FLAG.DATE)
;
我的預期輸出如下所示編輯:,但是即使應用日期過濾器,它似乎也需要很長時間(> 10 分鐘):
| 團體 | 地位 | 日期 |
|---|---|---|
| 一個 | 待辦的 | 2021-01-03 08:00:00 |
| 一個 | 待結算 | 2021-01-03 13:00:00 |
| 一個 | 待辦的 | 2021-01-04 08:00:00 |
| 一個 | 落戶 | 2021-01-04 13:00:00 |
| 乙 | 待辦的 | 2021-01-03 08:00:00 |
| 乙 | 待結算 | 2021-01-03 13:00:00 |
| 乙 | 待辦的 | 2021-01-04 08:00:00 |
| 乙 | 落戶 | 2021-01-04 13:00:00 |
uj5u.com熱心網友回復:
您可以使用last_value()視窗函式獲取組中的最后一個值,然后對其應用過濾器。
SELECT "GROUP",
"STATUS",
"DATE"
FROM (SELECT "GROUP",
"STATUS",
"DATE",
last_value("STATUS") OVER (PARTITION BY "GROUP",
trunc("DATE")
ORDER BY "DATE" ASC) lv
FROM "TABLE") x
WHERE lv NOT IN ('Cancelled',
'Failed');
編輯:
要過濾掉狀態所在的日期'Cancelled'或'Failed'一天中的任何時間,您可以使用例如視窗版本的count()和CASE運算式,NULL當狀態為'Cancelled'或時給出非值'Failed',否則NULL(默認值)。
SELECT "GROUP",
"STATUS",
"DATE"
FROM (SELECT "GROUP",
"STATUS",
"DATE",
count(CASE
WHEN "STATUS" IN ('Cancelled',
'Failed') THEN
0
END) OVER (PARTITION BY "GROUP",
trunc("DATE")) c
FROM "TABLE") x
WHERE c = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409096.html
標籤:
上一篇:選擇帳戶的最大行數
