使用COUNT()从子查询中进行MAX()查询

时间:2019-06-08 19:25:11

标签: sql sql-server

需要显示出行程最多的船名,所以我进行了查询以计算行程:

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

3 个答案:

答案 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