查找SQL中两列之间的最大日期范围的条目

时间:2013-05-09 07:25:52

标签: sql oracle

注意:这是在Oracle而不是MySQL中,limit / top不起作用。

我想要返回酒店中停留时间最长的人的姓名。通过使用checkout列减去checkin列中的日期,可以找到最长停留时间。 到目前为止,我有:

select fans.name 
from fans 
where fans.checkout-fans.checkin is not null
order by fans.checkout-fans.checkin desc;

但这只是命令每个人的逗留时间从最高到最低。我希望它只返回停留时间最长的人的名字(或名字,如果他们被绑定)。此外,由于不止一个人可以在最长的时间内停留,只需将limit 1添加到最后就行了。

编辑(对于gbn),在添加联接以从其他表中获取签入/结帐时,它将无法正常工作(未返回任何记录)

编辑2 现在已解决,以下联接应为players.team = teams.name

select
   x.name
from
    (
    select
        players.name,
        dense_rank() over (order by teams.checkout-teams.checkin desc) as rnk
    from
        players
    join teams
    on players.name = teams.name
    where
        teams.checkout-teams.checkin is not null
    ) x
where
   x.rnk = 1

6 个答案:

答案 0 :(得分:3)

应使用DENSE_RANK to get ties

select
   x.name
from
    (
    select
        fans.name,
        dense_rank() over (order by fans.checkout-fans.checkin desc) as rnk
    from
        fans 
    where
        fans.checkout-fans.checkin is not null
    ) x
where
   x.rnk = 1;

SQL Server为此提供了TOP..WITH TIES,但这是任何具有DENSE_RANK的RDBMS的通用解决方案。

答案 1 :(得分:0)

最长是一个模糊的词,你应该首先定义什么是你的长。使用限制可能不是这种情况的解决方案。因此,您可以定义阈值并尝试过滤结果where fans.checkout-fans.checkin > 10

答案 2 :(得分:0)

试试这个:

select name, (checkout-checkin) AS stay
from fans 
where stay is not null -- remove fans that never stayed at a hotel
order by stay desc;

答案 3 :(得分:0)

对于Oracle:

select * from 
(
select fans.name
from fans 
where fans.checkout-fans.checkin is not null
order by fans.checkout-fans.checkin desc)
where rownum=1

答案 4 :(得分:0)

另一种应该适用于所有dbms(或几乎所有dbms,至少支持子查询的方式)的方法:

select fans.name 
from fans 
where fans.checkout-fans.checkin = 
      ( select max(f.checkout-f.checkin) 
        from fans f
      ) ;

答案 5 :(得分:0)

如果两列都是日期字段,则可以使用此查询:

select fans.name from fans where fans.checkout-fans.checkin in (select max(fans.checkout-fans.checkin) from fans );