我對SQL相當陌生,所以這可能相當簡單,但我試圖在SQL中編寫一個腳本,這將允許我獲取一組數據,但我不想要查詢中的第一個或最後一個結果。我可以找到很多關於如何刪除第一個結果以及如何刪除最後的結果,但不是兩者都有。從sql查詢中排除第一個和最後一個結果
這是迄今爲止我的查詢:
SELECT * FROM itinerary Where ID = 'A1234' ORDER BY DateTime ASC
我想刪除第一個和該選擇基於日期時間的最後一個記錄。
我對SQL相當陌生,所以這可能相當簡單,但我試圖在SQL中編寫一個腳本,這將允許我獲取一組數據,但我不想要查詢中的第一個或最後一個結果。我可以找到很多關於如何刪除第一個結果以及如何刪除最後的結果,但不是兩者都有。從sql查詢中排除第一個和最後一個結果
這是迄今爲止我的查詢:
SELECT * FROM itinerary Where ID = 'A1234' ORDER BY DateTime ASC
我想刪除第一個和該選擇基於日期時間的最後一個記錄。
這可能不是執行此操作的最高性能方式,但您沒有提供任何模式信息,並且它看起來像您的ID列不是唯一的。如果你有一個主鍵可以工作,這會更容易。
SELECT * FROM itinerary
WHERE ID = 'A1234'
AND DateTime <
(SELECT MAX(DateTime) FROM itinerary WHERE ID = 'A1234')
AND DateTime >
(SELECT MIN(DateTime) FROM itinerary WHERE ID = 'A1234')
ORDER BY DateTime ASC
這將基本上選擇的每個記錄,其中ID是A1234和日期時間不等於MAX或MIN的日期時間。請注意,如果您有多個具有相同DateTime值的記錄,並且碰巧也是最小值或最大值,那麼您可能排除的不僅僅是第一個或最後一個。
雖然這可能已經足夠好了。如果沒有,你可能需要編寫一個存儲過程,而不是直接使用ANSI SQL。
以相反的順序&試試這個..
select * from
(select a.*,row_number() over (partition by DateTime order by DateTime desc) as rnm
from itinerary Where ID = 'A1234')x
where rm <> 1 and rm not in (
select max(rm) from
(
select row_number() over (partition by DateTime order by DateTime desc) as rnm
from itinerary Where ID = 'A1234'))
選擇跳過第一,然後在需要的順序從結果中選擇,第一跳過。
SELECT * FROM (SELECT *
FROM itinerary
Where ID = 'A1234'
ORDER BY DateTime DESC
LIMIT 1, 18446744073709551615) x ORDER BY DateTime ASC
LIMIT 1, 18446744073709551615
18446744073709551615只是在你想知道爲什麼我選擇了這個值
這樣的ID值不必重複我喜歡這些相關類型的查詢的情況下,最大的整數。 – shawnt00
簡單而有效。非常感謝。此外,我認爲ID應該是唯一的,但不能保證。 – RyuAkamatsu
@Ryu很明顯,你在'itinerary'中的ID不是唯一的,或者你不會試圖從結果中刪除兩行。當ID只匹配一次或兩次時,你真的不想要結果嗎? – shawnt00