Как получить наиболее частое значение из таблицы без использования Top, CTE, RowNum и Rank в SQL Server?

#sql-server

#sql-сервер

Вопрос:

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

 SELECT
    TOP 1 State
FROM
    City
GROUP BY
    State
ORDER BY
    count(State) DESC
 

Я знаю, что это можно сделать с помощью CTE, Rank и всего остального, но меня просят сделать это без использования CTE, Top, Rank, RowNum.

Комментарии:

1. Не могли бы вы предоставить некоторые примеры данных и ожидаемый результат?

2. @Tyron78 вы можете предположить таблицу с cityname, cityid, state. таким образом, несколько городов могут принадлежать одному и тому же государству (многие к одному)

Ответ №1:

Возможно ORDER BY ... OFFSET ... FETCH , это вариант:

 SELECT State
FROM (VALUES
   ('StateA'),
   ('StateA'),
   ('StateA'),
   ('StateB'),
   ('StateB')
) city (State)
GROUP BY State
ORDER BY COUNT(State) DESC OFFSET 0 ROW FETCH NEXT 1 ROW ONLY
 

Результат:

 State
------
StateA
 

Ответ №2:

Без TOP, ROW_NUMBER и т. Д. код становится немного уродливым, но вы можете достичь ожидаемого результата с помощью подзапросов:

 DECLARE @t TABLE(
  cityname nvarchar(10)
 ,cityid int
 ,statename nvarchar(10)
 ,stateid int
)

INSERT INTO @t VALUES
(N'City1', 1, N'State1', 1)
,(N'City2', 2, N'State1', 1)
,(N'City3', 3, N'State1', 1)
,(N'City4', 4, N'State2', 2)
,(N'City5', 5, N'State2', 2)

SELECT stateid, statename, cnt
  FROM(SELECT stateid, statename, COUNT(*) cnt
         FROM @t
         GROUP BY stateid, statename
      ) t
  WHERE cnt = (SELECT max(cnt)
                 FROM (SELECT stateid, statename, COUNT(*) cnt
                         FROM @t
                         GROUP BY stateid, statename
                       ) t2
              )
 

Комментарии:

1. Но это будет медленно, вы можете использовать 4 оператора select

2. Да, производительность не будет такой большой … но без использования «обычных» компонентов, таких как оконные функции и т. Д. Это процедура для результата … в любом случае: вы могли бы сначала сохранить содержимое первого подзапроса во временной таблице и использовать его в качестве источника — понятия не имею, разрешено ли это вваш случай