sql - 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 中,它会影响我的其余查询吗?
解决方案
在上面的这种情况下,由于提到的错误,我几乎被迫在我的组中包含“区域”和“大小”,即使它不包含我想要“分组”的任何数据。按列“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
会在同一个场中生成大量重复记录,并且无法区分它们),但是您不能按比使用更少的列进行分组
推荐阅读
- java - 队列并行处理的停止条件,其中任务可能产生更多任务
- docker - docker有没有办法访问主机IP
- python - 尝试更改个人资料图像时出现 MultiValueDictKeyError
- unity3d - Unity 2D 运行时闪烁
- vb.net - 从 VB.NET 直接使用 Python for .NET 访问 numpy 数组元素
- web - Google API OAuth 客户端:客户端 ID 不允许本地主机
- python - Python MailMerge 参考 word doc
- kubernetes - 如果使用 POD 亲和性,流量是否会路由到同一节点上的 POD?
- python - 如何使用 werkzeug 在 python 烧瓶中设置上下文本地对象?
- javascript - 原型类中未定义的 DOM 元素