所以我的資料看起來像圖片。列名 Track 是為了顯示狀態的步長。列名 Current_state 是應用程式當前的狀態。列名 Current_state_hist 是狀態的歷史記錄。
所以現在現在的狀態是AP。我想立即選擇最后一個狀態之前的所有狀態(軌道 13 和 14 中的 AP),而不洗掉軌道 5 - 8 中的狀態 AP。
有人可以幫我處理這個案子嗎?謝謝 資料示例
uj5u.com熱心網友回復:
您可以EXISTS為此使用:
模式和插入陳述句:
create table table1(id int, track int, current_state varchar(10), current_state_hist varchar(10), total_unit int);
insert into table1 values(1,1,'AP','OD',1)
insert into table1 values(1,2,'AP','OD',1)
insert into table1 values(1,3,'AP','OD',1)
insert into table1 values(1,4,'AP','OD',1)
insert into table1 values(1,5,'AP','AP',1)
insert into table1 values(1,6,'AP','AP',1)
insert into table1 values(1,7,'AP','AP',1)
insert into table1 values(1,8,'AP','AP',1)
insert into table1 values(1,9,'AP','OD',1)
insert into table1 values(1,10,'AP','OD',1)
insert into table1 values(1,11,'AP','OD',1)
insert into table1 values(1,12,'AP','OD',1)
insert into table1 values(1,13,'AP','AP',1)
insert into table1 values(1,14,'AP','AP',1)
詢問:
SELECT ID,TRACK,CURRENT_STATE,CURRENT_STATE_HIST,TOTAL_UNIT
FROM TABLE1 T1
WHERE EXISTS
(
SELECT 1 FROM TABLE1 T2
WHERE CURRENT_STATE<>CURRENT_STATE_HIST
AND T1.TRACK<=T2.TRACK
)
輸出:
| ID | 追蹤 | 當前狀態 | CURRENT_STATE_HIST | TOTAL_UNIT |
|---|---|---|---|---|
| 1 | 1 | 美聯社 | 外徑 | 1 |
| 1 | 2 | 美聯社 | 外徑 | 1 |
| 1 | 3 | 美聯社 | 外徑 | 1 |
| 1 | 4 | 美聯社 | 外徑 | 1 |
| 1 | 5 | 美聯社 | 美聯社 | 1 |
| 1 | 6 | 美聯社 | 美聯社 | 1 |
| 1 | 7 | 美聯社 | 美聯社 | 1 |
| 1 | 8 | 美聯社 | 美聯社 | 1 |
| 1 | 9 | 美聯社 | 外徑 | 1 |
| 1 | 10 | 美聯社 | 外徑 | 1 |
| 1 | 11 | 美聯社 | 外徑 | 1 |
| 1 | 12 | 美聯社 | 外徑 | 1 |
db<>在這里擺弄
uj5u.com熱心網友回復:
ROW_NUMBER使用決議函式,無需兩次查詢表即可找到最新狀態:
SELECT id, track, current_state, current_state_hist, total_unit
FROM (
SELECT t.*,
ROW_NUMBER() OVER (ORDER BY track DESC)
- ROW_NUMBER() OVER (
PARTITION BY current_state_hist ORDER BY track DESC
) AS rn
FROM table_name t
)
WHERE rn > 0;
或者,從 Oracle 12:
SELECT *
FROM table_name
MATCH_RECOGNIZE(
ORDER BY track DESC
ALL ROWS PER MATCH
PATTERN ( ^ {- same_hist -} any_hist* )
DEFINE
same_hist AS FIRST(current_state_hist) = current_state_hist
)
其中,對于樣本資料:
CREATE TABLE table_name (id, track, current_state, current_state_hist, total_unit) AS
SELECT 1, 1, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 2, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 3, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 4, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 5, 'AP', 'AP', 1 FROM DUAL UNION ALL
SELECT 1, 6, 'AP', 'AP', 1 FROM DUAL UNION ALL
SELECT 1, 7, 'AP', 'AP', 1 FROM DUAL UNION ALL
SELECT 1, 8, 'AP', 'AP', 1 FROM DUAL UNION ALL
SELECT 1, 9, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 10, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 11, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 12, 'AP', 'OD', 1 FROM DUAL UNION ALL
SELECT 1, 13, 'AP', 'AP', 1 FROM DUAL UNION ALL
SELECT 1, 14, 'AP', 'AP', 1 FROM DUAL;
兩個輸出:
ID 追蹤 當前狀態 CURRENT_STATE_HIST TOTAL_UNIT 1 12 美聯社 外徑 1 1 11 美聯社 外徑 1 1 10 美聯社 外徑 1 1 9 美聯社 外徑 1 1 8 美聯社 美聯社 1 1 7 美聯社 美聯社 1 1 6 美聯社 美聯社 1 1 5 美聯社 美聯社 1 1 4 美聯社 外徑 1 1 3 美聯社 外徑 1 1 2 美聯社 外徑 1 1 1 美聯社 外徑 1
我希望輸出是選擇除最后 2 行之外的所有內容...因為它是當前狀態...
如果您只想忽略最后兩行,則:對行ROWNUM進行排序,然后為有序行分配一個偽列,然后過濾ROWNUM以排除最新的兩行:
SELECT *
FROM (
SELECT t.*,
ROWNUM AS rn
FROM (
SELECT *
FROM table_name
ORDER BY track DESC
) t
)
WHERE rn >= 3;
或者,使用ROW_NUMBER決議函式:
SELECT *
FROM (
SELECT t.*,
ROW_NUMMBER() OVER (ORDER BY track DESC) AS rn
FROM table_name t
)
WHERE rn >= 3;
或者,從 Oracle 12:
SELECT *
FROM table_name
ORDER BY track DESC
OFFSET 2 ROWS
FETCH FIRST 100 PERCENT ONLY;
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/425315.html
