问题描述
尝试输入总人口 .vs 查询时出错。疫苗接种:
老实说,我不知道如何纠正这个错误,到目前为止,我已经尝试了尽可能多的 sql(我对 sql 很陌生)来弄乱代码来修复它。有什么建议么? (如果需要更多代码,请告诉我,我会发布整个项目,以便更好地了解问题的根源)
解决方法
错误消息抱怨“ORDER BY
窗口框架的RANGE
子句” - 您可能正在查看您的代码,没有看到 RANGE
并且不知道它在说什么.
了解 RANGE
是 OVER
clause 的可选部分会很有帮助:
OVER (
[ <PARTITION BY clause> ]
[ <ORDER BY clause> ]
[ <ROW or RANGE clause> ]
)
这有助于我们知道该错误是专门针对您查询的这一部分提出的:
OVER (PARTITION BY dea.LOCATION ORDER BY dea.LOCATION,dea.DATE)
因此,接下来我们再次阅读消息并意识到它抱怨存储在 dea.LOCATION
和 dea.DATE
列中的数据的组合宽度。如果没有看到列定义,我猜任何 DATE
列都会相当小,因此可以合理地假设大部分数据来自 LOCATION
列。
一方面,我们可以尝试减小此列的宽度,例如通过子字符串。但是,如果我们再次查看整个 OVER()
子句,我们会发现在 ORDER BY
部分根本不需要它。
为什么?
因为同一列用于对数据进行分区。 ORDER BY
定义了每个分区内的排序 - 但如果每个分区只包含共享相同 dea.LOCATION
值的行,那么根据定义,所有行将平等排序在该列值上。
因此,只需将其从 ORDER BY
中删除,错误就会消失。