Предположим, что у вас была таблица "Автомобили" с сотнями тысяч строк, и вы хотели сделать GROUP BY:
SELECT CarID
, CarName
, COUNT(*) AS Total
FROM dbo.tbl_Cars
GROUP BY CarID
, CarName
Группирование оставляет вас с результатом, похожим на:
CarID CarName Total
1872 Olds 202,121
547841 BMW 175,298
9877 Ford 10,241
Все хорошо и хорошо. Мой вопрос, однако, является тем, что является наилучшим способом получить Total и MAX Total в одну таблицу с точки зрения производительности и чистое кодирование, поэтому у вас есть результат, например:
CarID CarName Total Max Total
1872 Olds 202,121 202,121
547841 BMW 175,298 202,121
9877 Ford 10,241 202,121
Один из подходов заключался бы в том, чтобы привести результат GROUP в временную таблицу, а затем получить MAX из таблицы temp в локальную переменную. Но мне интересно, какой лучший способ сделать это.
UPDATE
Общее выражение таблицы выглядит наиболее элегантно, но похоже на @EBarr, мое ограниченное тестирование указывает на значительно более низкую производительность. Поэтому я не пойду с CTE.
Поскольку ссылка @EBarr для параметра COMPUTE
указывает на функцию
устарел, это тоже не лучший маршрут.
Параметр локальной переменной для значения MAX и использования временная таблица, вероятно, будет маршрутом, по которому я спускаюсь, поскольку я не осознавая проблемы с производительностью.
Немного больше о моем случае использования: возможно, это может оказаться серии других вопросов. Но достаточно сказать, что я загружаю большое подмножество данных в временную таблицу (поэтому подмножество tbl_Cars переход в #tbl_Cars, и даже #tbl_Cars может быть дополнительно отфильтрован и на нем выполняются агрегации), потому что мне приходится выполнять множественную фильтрацию и запросы агрегации на нем в рамках одной хранимой процедуры который возвращает несколько наборов результатов.
ОБНОВЛЕНИЕ 2
@EBarr использование оконной функции является приятным и коротким. Примечание для себя:
если используется RIGHT JOIN
во внешней справочной таблице, COUNT()
функция должна выбрать столбец из tbl_Cars, а не '*'
.
SELECT M.MachineID
, M.MachineType
, COUNT(C.CarID) AS Total
, MAX(COUNT(C.CarID)) OVER() as MaxTotal
FROM dbo.tbl_Cars C
RIGHT JOIN dbo.tbl_Machines M
ON C.CarID = M.CarID
GROUP BY M.MachineID
, M.MachineType
С точки зрения скорости это кажется прекрасным, но в какой момент вы должны быть беспокоился о количестве прочитанных?