Получение наиболее частого значения для каждой группы в SQL Server

#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
  

Если вам нужны дополнительные столбцы, то ваш код уже корректен из-за того, как вы его группируете, и отдельных значений, содержащихся в столбцах.