首页 > 解决方案 > SQL:一旦达到唯一分组,分组依据中的列是否重要?

问题描述

由于错误,“列在选择列表中无效,因为它不包含在聚合函数或 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 列需要选择,这是不好的做法和/或如果我将所有这些其他列包含在我的 group by 中,它会影响我的其余查询吗?

标签: sqlsql-servergroup-by

解决方案


在上面的这种情况下,由于提到的错误,我几乎被迫在我的组中包含“区域”和“大小”,即使它不包含我想要“分组”的任何数据。按列“FlockType”、“FarmNo”和“SettleDate”分组返回唯一记录。通过这些分组,将永​​远不会返回两条相同的记录。

SQLServer 不一定知道这一点,因为在未来的任何时候,可能会有超过 1 行参与该组。它不会查看表定义并转到“哦,flocktype/farmno/settleddate 是表的唯一键,因此该组合永远不会超过行,所以我会让用户逃脱对这些列进行分组,并添加他们喜欢的任何其他列,而不进行分组/聚合函数”

为什么不这样做?可能是因为它是不必要的复杂性;SELECT flock, farm, settledate, x GROUP BY flock, farm, settledate, x作为用户,您可以欣赏这一点,因此无论您执行 a还是执行 a都无关紧要SELECT flock, farm, settledate, max(x) GROUP BY flock, farm, settledate- 最终结果将是相同的。通过强制您指定到这种程度,即使删除了唯一键并添加了更多行,查询也将继续工作,但这是“在分组情况下不考虑唯一键,只是为了节省您有键入几个字符,因为它们不必是,考虑到它们可能非常复杂”

因此,“区域”和“大小”列会影响查询吗?

不,无论您是对它们进行分组还是聚合它们,它们都只有一个,因此它们没有任何区别。我认为您也不会发现明显的性能差异,因为它本质上只是“它们位于哈希表的哪一侧;作为单个键还是单个值?”

假设我有 100 列需要选择,这是不好的做法和/或如果我将所有这些其他列包含在我的 group by 中,它会影响我的其余查询吗?

您必须按列分组或将其包含在聚合中。您可以按比使用更多的列进行分组(但这会让人感到困惑,因为select farm group by farm, flock, settle会在同一个场中生成大量重复记录,并且无法区分它们),但是您不能按比使用更少的列进行分组


推荐阅读