需要显示出行程最多的船名,所以我进行了查询以计算行程:
SELECT B.IdBoat, COUNT(T.IdTrip)
FROM Trip T INNER JOIN Boat B ON T.IdBoat=B.IdBoat
GROUP BY B.IdBoat
现在我需要显示具有MAX行程的那个的名称,如何在不使用ORDER BY DESC和TOP 1而是使用MAX的情况下,将该查询用作子查询? 目前得到:
SELECT B.Name
FROM Trip T INNER JOIN Boat B ON T.IdBoat=B.IdBoat
WHERE B.IdBoat = MAX( the sub query above)
也尝试过
SELECT B.Name, T.IdTrip
FROM Boat B INNER JOIN Trip T ON B.IdBoat=T.IdBoat
WHERE B.IdBoat IN (
SELECT MAX(T.NTrips) FROM
(SELECT B.IdBoat AS [IdBoat], COUNT(T.IdTrip) AS [NTrips]
FROM Trip T INNER JOIN Boat B ON B.IdBoat=T.IdBoat
GROUP BY B.Boat) T
GROUP BY T.IdBoat)
上面的代码返回了船名的全数3,而不是正确的2。
我已经尝试使用Google搜索和搜索关于stackoverflow等问题,但是无法根据我的查询调整其解决方案,任何帮助都是有帮助的。
谢谢。
编辑1.根据要求,我将提供一些数据以帮助更好地理解问题
桌船:
IdBoat | Name
1 | 'SS Sparrow'
2 | 'SS AndaNoMar'
餐桌旅行
IdTrip | IdBoat
1 | 1
2 | 1
3 | 2
子查询1(COUNT个)
IdBoat | NTrips
2 | 1
1 | 2
答案 0 :(得分:2)
您可以这样做:
with
x as (
select
b.idBoat,
b.Name,
count(*) as cnt
from trip t
join boat b on b.idBoat = t.idBoat
group by b.idBoat, b.Name
),
m as (
select max(cnt) as max_cnt from x
)
select
x.*
from x
join m on m.max_cnt = x.cnt
答案 1 :(得分:1)
SELECT
B.IdBoat,
B.Name,
T.Trips
FROM
Boat AS B
INNER JOIN
(
SELECT
IdBoat,
COUNT(*) AS Trips,
RANK() OVER (PARTITION BY IdBoat
ORDER BY COUNT(*) DESC
)
AS TripsRank
FROM
Trip
GROUP BY
IdBoat
)
AS T
ON T.IdBoat = B.IdBoat
WHERE
T.TripsRank = 1
答案 2 :(得分:0)
比其他两个答案中的任何一个更好的方法是使用ORDER BY
:
SELECT TOP (1) B.IdBoat, B.Name, COUNT(T.IdTrip) as cnt
FROM Trip T INNER JOIN
Boat B
ON T.IdBoat = B.IdBoat
GROUP BY B.IdBoat, B.Name
ORDER BY cnt DESC;
不需要子查询,CTE或窗口功能。
如果想要建立联系,则可以使用TOP (1) WITH TIES
。