有人可以帮助我理解 SQL Server 查询中的这个 ORDER BY 错误吗?

问题描述

尝试输入总人口 .vs 查询时出错。疫苗接种:

1

老实说,我不知道如何纠正这个错误,到目前为止,我已经尝试了尽可能多的 sql(我对 sql 很陌生)来弄乱代码来修复它。有什么建议么? (如果需要更多代码,请告诉我,我会发布整个项目,以便更好地了解问题的根源)

解决方法

错误消息抱怨“ORDER BY 窗口框架的RANGE 子句” - 您可能正在查看您的代码,没有看到 RANGE 并且不知道它在说什么.

了解 RANGEOVER clause 的可选部分会很有帮助:

OVER (   
   [ <PARTITION BY clause> ]  
   [ <ORDER BY clause> ]   
   [ <ROW or RANGE clause> ]  
  )

这有助于我们知道该错误是专门针对您查询的这一部分提出的:

OVER (PARTITION BY dea.LOCATION ORDER BY dea.LOCATION,dea.DATE)

因此,接下来我们再次阅读消息并意识到它抱怨存储在 dea.LOCATIONdea.DATE 列中的数据的组合宽度。如果没有看到列定义,我猜任何 DATE 列都会相当小,因此可以合理地假设大部分数据来自 LOCATION 列。

一方面,我们可以尝试减小此列的宽度,例如通过子字符串。但是,如果我们再次查看整个 OVER() 子句,我们会发现在 ORDER BY 部分根本不需要它。

为什么?

因为同一列用于对数据进行分区。 ORDER BY 定义了每个分区的排序 - 但如果每个分区只包含共享相同 dea.LOCATION 值的行,那么根据定义,所有行将平等排序在该列值上。

因此,只需将其从 ORDER BY 中删除,错误就会消失。