SQL Server 2005中ORDER BY为何无法与窗口函数配合使用?
语法错误原因及解决办法
错误原因
SQL Server 2005对窗口函数的支持存在版本限制:它的OVER()子句仅支持PARTITION BY,不允许在其中使用ORDER BY。你写的语句里,在SUM(CONVERT(int, v.new_vaccinations)) OVER (PARTITION BY d.location ORDER BY d.location,d.date)中加入了ORDER BY,这违反了2005的语法规则,因此触发了Incorrect syntax near 'order'的错误。
替代解决方案(SQL Server 2005兼容)
要实现按location分组、按date排序的累计接种数,可以用自连接加子查询的方式来模拟:
SELECT d.location, d.continent, d.date, d.population, v.new_vaccinations, ( SELECT SUM(CONVERT(int, v2.new_vaccinations)) FROM PortofolioProject..covidvaccinations v2 JOIN PortofolioProject..coviddeaths d2 ON v2.location = d2.location AND v2.date = d2.date WHERE d2.location = d.location AND d2.date <= d.date ) AS rolling_total_vaccinations FROM PortofolioProject..coviddeaths d JOIN PortofolioProject..covidvaccinations v ON d.location = v.location AND d.date = v.date WHERE d.continent IS NOT NULL ORDER BY d.location, d.date
另一种选择
如果可以升级到SQL Server 2012及以上版本,你原来的窗口函数语法就可以直接正常运行——从2012版本开始,SQL Server支持在OVER()子句中使用ORDER BY来定义累计窗口。
内容的提问来源于stack exchange,提问作者Mahmoud Saad
相关产品推荐
相关产品推荐

