SQL: Имеют ли значение столбцы в группе По достижении уникальной группировки? - PullRequest
0 голосов
/ 31 января 2019

Из-за ошибки «Столбец недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY».Мне интересно, если после стольких группировок столбцы, перечисленные в Group By, больше не влияют на запрос.Я разместил простой запрос ниже, например.

Select FlockType, FarmNo, SettleDate, Sum(Weight) as Weight, Area, Size
FROM  Table
WHERE SettlementDate BETWEEN '2018-01-01' AND '2018-02-01  
GROUP BY FlockType, FarmNo, SettleDate, Area, Size

В этом случае из-за упомянутой ошибки я в значительной степени вынужден включить в свою группу «Площадь» и «Размер», хотя она не содержит данных, которые я быхочу "Группировать" дальше.Группировка по столбцам «FlockType», «FarmNo» и «SettleDate» возвращает уникальную запись.По этим группировкам никогда не будет возвращено две одинаковые записи.Из-за этого столбцы 'Площадь' и 'Размер' влияют на запрос?Скажем, у меня есть 100 столбцов, которые нужно выбрать, это плохая практика и / или это повлияет на остальную часть моего запроса, если я включу все эти другие столбцы в свою группу?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

В этом случае выше, из-за упомянутой ошибки, я в значительной степени вынужден включить "Площадь" и "Размер" в мою группу, даже если она не содержит данных, которые я хотел бы "Группа "на.Группировка по столбцам «FlockType», «FarmNo» и «SettleDate» возвращает уникальную запись.По этим группировкам никогда не будет возвращено две одинаковые записи.

SQLServer не обязательно знает это, потому что в любое время в будущем МОЖЕТ быть случай, когда в группе участвует более 1 строки.Он не будет смотреть на определение таблицы и идти: «О, flocktype / farmno / deposledate - это уникальный ключ таблицы, поэтому с этой комбинацией никогда не будет больше строки, поэтому я позволю пользователю простогруппировка по этим столбцам и добавление любых других столбцов, которые им нравятся, без группировки / функции агрегирования "

Почему этого не происходит?Возможно, потому что это ненужная сложность;как пользователь, вы можете оценить это, и, следовательно, не имеет значения, делаете ли вы SELECT flock, farm, settledate, x GROUP BY flock, farm, settledate, x или SELECT flock, farm, settledate, max(x) GROUP BY flock, farm, settledate - конечный результат будет таким же.Вынуждая вас указывать до такой степени, запрос будет продолжать работать, даже если уникальный ключ удален и добавлено больше строк, но это вторично к понятию, что «уникальные ключи не учитываются в ситуациях группирования, просто чтобы избавить вас от необходимостинабрать несколько символов, потому что они не должны быть такими, и их рассмотрение может быть очень сложным "

Из-за этого столбцы 'Площадь' и 'Размер' влияют на запрос?

Нет, группируете ли вы их или объединяете их, есть только один из них, поэтому они не имеют никакого значения в любом случае.Я не думаю, что вы также найдете заметную разницу в производительности, так как по сути это просто «на какой стороне хеш-таблицы они находятся: в качестве единственного ключа или в виде единого значения?»

Скажем, у меня есть 100 столбцов, которые нужно выбрать, это плохая практика и / или это повлияет на остальную часть моего запроса, если я включу все эти другие столбцы в свою группу?

Выдолжны группироваться по столбцу или включать его в совокупность.Вы можете группировать по большему количеству столбцов, чем используете (но это сбивает с толку, потому что select farm group by farm, flock, settle генерирует множество повторных записей с одной и той же фермой и ничего не может их отличить), но вы не можете сгруппировать по меньшему количеству столбцов, чем используете

0 голосов
/ 31 января 2019

Чтобы избежать группировки некоторых столбцов, но иметь возможность использовать их в операторе SELECT, вам следует использовать агрегатные функции для этих столбцов.Например:

Select 
FlockType, FarmNo, SettleDate, 
Sum(Weight) as Weight, Max(Area) MaxArea, Max(Size) MaxSize
FROM  Table
WHERE SettlementDate BETWEEN '2018-01-01' AND '2018-02-01  
GROUP BY FlockType, FarmNo, SettleDate

Ошибка означает, что у вас есть SUM из поля Weight и GROUP - одна строка, но в SQL Server также есть много других строк с вычисляемым столбцом, и это не такзнать, какую именно строку следует выбрать.

...