2015-10-21 59 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只是在你想知道为什么我选择了这个值

相关问题