我对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