注意:这是在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
答案 0 :(得分:3)
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 );