В книге Запросы MS SQL Server 2012 (учебный комплект) для экзамена 70-461 это говорит о GROUP BY
фаза запроса в логической обработки:Что возвращает фаза GROUP BY в обработке логических запросов в SQL?
Конечный результат этого запроса содержит одну строку, представляющую каждую группу (если не отфильтровано). Поэтому выражения во всех фазах, которые принимают место после текущей фазы группировки, несколько ограничены. Все выражения , обработанные на последующих этапах, должны гарантировать одно значение для каждой группы. Если вы ссылаетесь на элемент из списка GROUP BY (например, страны), у вас уже есть такая гарантия, поэтому такая ссылка разрешена. Однако, если вы хотите обратиться к элементу, который не является частью вашего списка GROUP BY (например, empid), он должен быть , содержащимся в совокупной функции, такой как MAX или SUM. Это связано с тем, что в элементе внутри одной группы возможны , а - единственный способ гарантировать, что только один будет возвращен, - суммировать значения.
Затем автор упоминает шаг HAVING
, где использует COUNT(*) > 1
. Мой вопрос: если GROUP BY
имеет только результат из 1 строки на группу, как фаза HAVING
использует эту одну группу, чтобы отфильтровывать любые группы с более чем одной строкой ... которые она делает, поскольку половина из них остается? Так что я что-то пропустил. Есть ли какая-то скрытая колонка COUNT, прикрепленная к каждой группе?
Этот запрос:
SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees
FROM HR.Employees
WHERE hiredate >= '20030101'
GROUP BY country, YEAR(hiredate)
HAVING COUNT(*) > 1
ORDER BY country , yearhired DESC;
Пожалуйста englighten.
Можете ли вы разместить запрос? –
Счетчик (*) рассчитывается до фазы группировки. – Arvo
@Arvo Рассчитывается в то же время, что и фаза группировки, она является частью одной и той же операции (агрегат Stream/hash) – GarethD