Выполнение запроса MAX () из подзапроса с помощью COUNT () - PullRequest
3 голосов
/ 08 июня 2019

Мне нужно показать название лодки, которая совершила наибольшее количество поездок, поэтому я сделал запрос, который подсчитывает количество поездок:

SELECT B.IdBoat, COUNT(T.IdTrip)
FROM Trip T INNER JOIN Boat B ON T.IdBoat=B.IdBoat
GROUP BY B.IdBoat

Теперь мне нужно показать имя той с МАКС. ПоездкиКак использовать этот запрос в качестве подзапроса, без использования 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.

IЯ пытался найти и найти указанную проблему в stackoverflow и других, но не могу адаптировать свое решение к моему запросу, любая помощь - хорошая помощь.

Спасибо.

edit 1. В ответ на запрос я предоставлю некоторые данные, которые помогут лучше понять проблему

Настольная лодка:

IdBoat | Name
1      | 'SS Sparrow'
2      | 'SS AndaNoMar'

Table Trip

IdTrip | IdBoat
1      | 1
2      | 1
3      | 2

Подзапрос 1 (COUNT)

IdBoat | NTrips
2      | 1
1      | 2

Ответы [ 3 ]

2 голосов
/ 08 июня 2019

Вы можете сделать:

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 голос
/ 08 июня 2019
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
0 голосов
/ 09 июня 2019

Лучшим методом, чем любой из двух других ответов, является использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...