#sql #sql-server
#sql #sql-сервер
Вопрос:
Это то, что у меня есть:
AirlineName Departure_City No_of_DepartureCity Arrival_City No_of_ArrivalCity
---------------------------------------------------------------------------------------------------- -------------- ------------------- ------------ -----------------
Air Asia MY 2 JPN 2
Emirates Airlines MY 2 JPN 2
Malaysia Airlines MY 2 GER 2
Malaysia Airlines MY 1 JPN 1
Air Asia MY 1 KOR 1
Это то, что я хочу:
AirlineName Departure_City No_of_DepartureCity Arrival_City No_of_ArrivalCity
---------------------------------------------------------------------------------------------------- -------------- ------------------- ------------ -----------------
Air Asia MY 2 JPN 2
Emirates Airlines MY 2 JPN 2
Malaysia Airlines MY 2 GER 2
Я уже написал запрос для извлечения наиболее частых данных для Departure_City
и Arrival_City
, но я не могу сгруппировать их вместе и отображать только наиболее частые данные для каждого AirlineName
.
Пока это мой запрос:
SELECT Airline.AirlineName, Flight_Schedule.Departure_City, COUNT(Flight_Schedule.Departure_City) AS No_of_DepartureCity, Flight_Schedule.Arrival_City, COUNT(Flight_Schedule.Arrival_City) AS No_of_ArrivalCity
FROM Airline
LEFT JOIN Aircraft ON Airline.AirlineID = Aircraft.AirlineID
LEFT JOIN Flight_Schedule ON Aircraft.AircraftID = Flight_Schedule.AircraftID
GROUP BY Airline.AirlineName, Flight_Schedule.Departure_City, Flight_Schedule.Arrival_City
ORDER BY COUNT(Flight_Schedule.Departure_City)DESC , COUNT(Flight_Schedule.Arrival_City) DESC
Комментарии:
1. Взгляните на ROW_NUMBER / RANK
2. @bk23 . . . Ваш образец данных и ваш запрос не имеют ничего общего друг с другом, что затрудняет понимание вопроса.
Ответ №1:
Вы можете использовать функцию Rank
или Dense_rank
(Если вы хотите выбрать более двух строк с одинаковым количеством городов)
with CTE1 AS(
SELECT A.*,
RANK() OVER(PARTITION BY AirlineName ORDER BY No_of_ArrivalCity desc) as rn
FROM TABLE1 A)
SELECT * FROM CTE1 where rn = 1;
Ответ №2:
Поскольку вы группируете по множеству столбцов, вместо простого ‘AirlineName’ выполняется группировка по всем различным значениям в этом количестве столбцов.
Чтобы вернуть количество AirlineName и их частоту, попробуйте следующее:
SELECT Airline.AirlineName, COUNT(*) AS [COUNT]
FROM Airline
GROUP BY Airline.AirlineName
ORDER BY COUNT(*) DESC
Если вам нужны дополнительные столбцы, то ваш код уже корректен из-за того, как вы его группируете, и отдельных значений, содержащихся в столбцах.