0

注意:这是在 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
4

6 回答 6

3

应该是使用DENSE_RANK 来获得平局

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 的通用解决方案。

于 2013-05-09T07:40:24.280 回答
0

对于甲骨文:

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
于 2013-05-09T07:58:51.153 回答
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;
于 2013-05-09T07:31:48.723 回答
0

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

于 2013-05-09T07:29:30.357 回答
0

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

select fans.name 
from fans 
where fans.checkout-fans.checkin = 
      ( select max(f.checkout-f.checkin) 
        from fans f
      ) ;
于 2013-05-09T09:20:58.460 回答
0

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

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

于 2013-05-09T10:06:16.203 回答