我正在嘗試提取型別 A 的 End_Time 不等于每個 System_Id 的 Max End_Time 的 ID 值
ID System_Id Type End_Time
1 1 A 10:00
1 1 B 12:00
1 2 A 14:00
1 2 B 14:00
2 3 A 07:00
2 3 B 07:00
所以最終結果應該是:
ID System_ID Type End_Time
1 1 A 10:00
現在我正在嘗試這個:
Select ID
From TestTable t
WHERE t.Type LIKE 'A'
AND t.End_Time <
(
SELECT MAX(t2.End_Time)
From TestTable t2
Order by System_Id
)
我認為這個查詢應該沒問題,因為如果我在子查詢中詢問特定的 ID,并且在它之外 - 它會回傳正確的答案。我認為我需要以某種方式也按 ID 對其進行分組,但我真的不知道如何。如果這改變了一些事情,資料庫就是 Oracle。
uj5u.com熱心網友回復:
您可以使用RANK分析功能:
SELECT ID, System_Id, Type, End_Time
FROM (
SELECT t.*,
RANK() OVER (PARTITION BY system_id ORDER BY end_time DESC) AS rnk
FROM testtable t
)
WHERE type = 'A'
AND rnk > 1;
或者,MAX決議函式:
SELECT ID, System_Id, Type, End_Time
FROM (
SELECT t.*,
MAX(end_time) OVER (PARTITION BY system_id) AS max_end_time
FROM testtable t
)
WHERE type = 'A'
AND end_time < max_end_time;
或者,可以通過將子查詢與外部查詢相關聯來修復您的查詢:
SELECT *
FROM TestTable t
WHERE t.Type = 'A'
AND t.End_Time < ( SELECT MAX(t2.End_Time)
FROM TestTable t2
WHERE t.system_id = t2.system_id )
注意:前兩個查詢僅SELECT ... FROM TestTable一次,外部查詢純粹用于過濾現有資料。最終查詢SELECT ... FROM TestTable兩次,效率可能會降低。
然后,對于樣本資料:
CREATE TABLE testtable (ID, System_Id, Type, End_Time) AS
SELECT 1, 1, 'A', INTERVAL '10:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 1, 1, 'B', INTERVAL '12:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 1, 2, 'A', INTERVAL '14:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 1, 2, 'B', INTERVAL '14:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 2, 3, 'A', INTERVAL '07:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 2, 3, 'B', INTERVAL '07:00' HOUR TO MINUTE FROM DUAL;
所有查詢輸出:
ID SYSTEM_ID 型別 時間結束 1 1 一種 00 10:00:00
db<>在這里擺弄
uj5u.com熱心網友回復:
是的,你是對的,GROUP BY 應該用于這個查詢。請試試:
SELECT t1.ID
FROM Testtable T1
INNER JOIN (
SELECT ID, MAX(END_TIME) AS END_TIME_MAX
FROM Testtable
GROUP BY ID
) T2
ON T1.ID = T2.ID
WHERE T1.END_TIME < T2.END_TIME_MAX
AND T1.Type = 'A'
uj5u.com熱心網友回復:
使用EXISTS:
SELECT t1.*
FROM TestTable t1
WHERE t1.Type = 'A'
AND EXISTS (
SELECT *
FROM TestTable t2
WHERE t2.ID = t1.ID AND t2.End_Time > t1.End_Time
);
或自加入:
SELECT DISTINCT t1.*
FROM TestTable t1 INNER JOIN TestTable t2
ON t2.ID = t1.ID AND t2.End_Time > t1.End_Time
WHERE t1.Type = 'A';
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467487.html
