【问题标题】:Window function not giving running total窗口函数没有给出运行总数
【发布时间】:2021-08-22 11:38:32
【问题描述】:

在以下查询中:

SELECT
 d.date,
 d.location,
 d.population,
 v.new_vaccinations,
 SUM(CAST(v.new_vaccinations AS int)) OVER (PARTITION BY d.location) AS total_vaccinations
FROM
 CovidDeaths d
JOIN
 CovidVaccinations v
ON
 d.date = v.date
 AND
 d.location = v.location
WHERE  
 d.continent IS NOT NULL
ORDER BY 
 d.location,
 d.date

窗口函数只是给出每个位置的总数,而不是根据日期的运行总数。 我做错了什么?

【问题讨论】:

  • 如果你想要一个“运行总数”,你需要在 OVER 子句中添加一个 ORDER BY 子句。否则SUM 将包括PARTITION 中的所有行。 documentation includes an example.
  • @Larnu:谢谢。我试过这个并且它有效,但我仍然无法理解它为什么有效。我阅读了文档,它说-“在 OVER 子句中指定的 ORDER BY 子句确定了 SUM 函数应用的逻辑顺序。”但这不只是意味着只有订单受到影响吗?它怎么能给出运行总数?
  • 查看它链接到的文档,如果没有指定,请密切注意默认边界:OVER Clause (Transact-SQL) - ORDER BY

标签: sql-server window-functions


【解决方案1】:

要获得运行累计总数,RANGEROWS 窗口必须在 OVER 中指定或隐含,因此您还需要添加 ORDER BY。否则窗口就是完整的分区。

指定ORDER BY 后,默认隐含窗口为RANGE UNBOUNDED PRECEDING,这会为来自ROWS 的非唯一排序提供不同的结果。

鉴于date 可能不是唯一的,您还需要ROWS UNBOUNDED PRECEDING

SELECT
 d.date,
 d.location,
 d.population,
 v.new_vaccinations,
 SUM(CAST(v.new_vaccinations AS int))
    OVER (PARTITION BY d.location ORDER BY d.date ROWS UNBOUNDED PRECEDING) AS total_vaccinations
FROM
 CovidDeaths d
JOIN
 CovidVaccinations v
ON
 d.date = v.date
 AND
 d.location = v.location
WHERE  
 d.continent IS NOT NULL
ORDER BY 
 d.location,
 d.date

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2023-03-30
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多