2015-10-21 61 views
1

我對SQL相當陌生,所以這可能相當簡單,但我試圖在SQL中編寫一個腳本,這將允許我獲取一組數據,但我不想要查詢中的第一個或最後一個結果。我可以找到很多關於如何刪除第一個結果以及如何刪除最後的結果,但不是兩者都有。從sql查詢中排除第一個和最後一個結果

這是迄今爲止我的查詢:

SELECT * FROM itinerary Where ID = 'A1234' ORDER BY DateTime ASC 

我想刪除第一個和該選擇基於日期時間的最後一個記錄。

回答

2

這可能不是執行此操作的最高性能方式,但您沒有提供任何模式信息,並且它看起來像您的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。

+0

這樣的ID值不必重複我喜歡這些相關類型的查詢的情況下,最大的整數。 – shawnt00

+0

簡單而有效。非常感謝。此外,我認爲ID應該是唯一的,但不能保證。 – RyuAkamatsu

+0

@Ryu很明顯,你在'itinerary'中的ID不是唯一的,或者你不會試圖從結果中刪除兩行。當ID只匹配一次或兩次時,你真的不想要結果嗎? – shawnt00

0

以相反的順序&試試這個..

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')) 
0

選擇跳過第一,然後在需要的順序從結果中選擇,第一跳過。

SELECT * FROM (SELECT * 
FROM itinerary 
Where ID = 'A1234' 
ORDER BY DateTime DESC 
LIMIT 1, 18446744073709551615) x ORDER BY DateTime ASC 
LIMIT 1, 18446744073709551615 

18446744073709551615只是在你想知道爲什麼我選擇了這個值

相關問題