#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. Да, производительность не будет такой большой … но без использования «обычных» компонентов, таких как оконные функции и т. Д. Это процедура для результата … в любом случае: вы могли бы сначала сохранить содержимое первого подзапроса во временной таблице и использовать его в качестве источника — понятия не имею, разрешено ли это вваш случай