SQL OVER() 子句 - 何时以及为何有用?

2023-12-11

    USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
    ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
    ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
    ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);

我读到了该条款,但不明白为什么我需要它。 作用是什么Over做?什么是Partition By做? 为什么我不能用书写方式进行查询Group By SalesOrderID?


You can use GROUP BY SalesOrderID。不同之处在于,使用 GROUP BY,您只能获得未包含在 GROUP BY 中的列的聚合值。

相反,使用窗口聚合函数而不是 GROUP BY,您可以检索聚合值和非聚合值。也就是说,尽管您在示例查询中没有这样做,但您可以检索两个单独的OrderQty相同组的值及其总和、计数、平均值等SalesOrderIDs.

下面是一个实际示例,说明窗口聚合为何如此出色。假设您需要计算每个值占总数的百分比。如果没有窗口聚合,您必须首先派生聚合值列表,然后将其连接回原始行集,即像这样:

SELECT
  orig.[Partition],
  orig.Value,
  orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
  INNER JOIN (
    SELECT
      [Partition],
      SUM(Value) AS TotalValue
    FROM OriginalRowset
    GROUP BY [Partition]
  ) agg ON orig.[Partition] = agg.[Partition]

现在看看如何使用窗口聚合执行相同的操作:

SELECT
  [Partition],
  Value,
  Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig

更容易、更干净,不是吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL OVER() 子句 - 何时以及为何有用? 的相关文章

随机推荐

  • 尝试读取或写入受保护的内存

    我开始看到我的应用程序中的几个不同位置抛出了 AccessViolationException 它从未发生在我的开发电脑 我们的测试服务器上 它也只出现在我们 2 台生产服务器中的 1 台上 因为它似乎只发生在我们的一台生产服务器上 所以我
  • 如何检测UDP数据包是否丢失? (C#)

    我正在开发 SNTP 客户端 它通过 UDP 从 NTP 服务器获取时间戳 一切正常 我可以下载时间戳并更新 Windows 时钟 但如果 UDP 数据包丢失 我想收到一条消息 如何检测数据包何时丢失 我需要这些信息 因为如果数据丢失我想获
  • 使用 awk 忽略 CSV 文件字段中的逗号

    我试图从 CSV 文件最后一行的第二个字段中获取一个数字 到目前为止 我有这个 awk F END print 2 file path fileName csv 除非最后一行中的第一个字段中有逗号 否则这是有效的 所以对于看起来像这样的行
  • 修改无窗口 QLabel 的 Alpha 通道透明度

    我有一个非常小的 Qt 应用程序 它使用标签来显示 jpeg 图像 而无需先将其放入窗口中 我得到了很多帮助使用 QtGui 显示 QImage 现在我想更改此 jpeg 的 Alpha 通道以使图像部分透明 我尝试过以下操作 但没有任何运
  • 在 Spring 测试中忽略 MongoDB 套接字连接

    我在 spring 项目中使用 mongo 但无法连接到 mongo 服务器 任何人都知道在执行测试时忽略这个 bean 的方法 因为有时我没有 mongo 服务器 并且我不希望此构建失败 我真的很想知道我是否可以使用 SpringRunn
  • NHibernate级联保存

    这是试图将 null 插入 Comment BlogArticleID 出现以下 GenericADOException 无法插入 NHibernate OneToMany BO Comment SQL INSERT INTO Commen
  • C++ 将对象向量中的元素复制到包含该元素的向量中

    我想复制a值来自foos将向量转换为另一个向量 只需int价值 最快的方法是什么 include
  • “内联”关键字和“内联”优化是不同的概念吗?

    我问这个基本问题是为了澄清事实 已提及这个问题 and 目前接受的答案 这没有说服力 但是 那得票数第二高的答案提供了更好的洞察力 但也不完美 在阅读下面的内容时 尝试区分inline keyword和 内联 concept 这是我的看法
  • Bootstrap 4 导航栏未显示[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Bootstrap 4 创建导航栏 这是我的 package json 文件的内容 name NAME here version 1 0 0 description Descripttion ge
  • 为 iPad 和 iPhone 设置输入按钮的样式

    我使用 CSS 来设置网站上输入按钮的样式 但在 IOS 设备上 样式被 Mac 的默认按钮所取代 有没有一种方法可以为 iOS 设计按钮样式 或者可以制作一个行为类似于提交按钮的超链接 您可能正在寻找 webkit appearance
  • Java EE 6 编程安全性、glassfish 和 JDBC 领域

    我正在探索基于 glassfish 服务器的 jdbc 领域的纯 Java EE 方法来实现编程安全性 特别是登录用户 基本上 在我的登录 servlet 中我正在做 String username request getParameter
  • Laravel 4:如何运行原始 SQL?

    我想重命名 Laravel 4 中的表 但不知道该怎么做 SQL 是alter table photos rename to images 如果有 Eloquent 解决方案 我还想知道如何运行原始 SQL 因为有时别无选择 In the
  • R:如何让我的包使用另一个包?

    这是一个非常简单的问题 我正在延长某人的包裹 它当前使用包 A B 它们列在说明文件中 如果我需要包 C 中的函数 将包添加到依赖项 我是否只需在描述文件中添加包就足够了 进入哪个部分 依赖或导入 还需要采取更多其他步骤吗 一旦我的代码需要
  • Google Apps 脚本中的格式化日期

    我试图在提交表单时获取包含简单格式化日期的电子表格 但所有日期 包括时间戳 都被发布为 1969 年 12 月 31 日下午 2 00 我做错了什么 任何帮助将不胜感激 function formSubmitReply e var shee
  • 有没有一个工具可以将swf反编译为actionscript? [复制]

    这个问题在这里已经有答案了 可能的重复 如何反编译 swf 文件 有人知道有这样的工具吗 硕思的反编译器是一个很好的起点
  • 从 pojo 生成 JsonSchema:如何自动添加“描述”?

    我正在尝试从项目中的 pojos 自动生成 JsonSchema 代码如下所示 ObjectMapper mapper new ObjectMapper SchemaFactoryWrapper visitor new SchemaFact
  • 只想比较 TIME 值 MomentJS

    在浏览了一些其他 MomentJS 问题和答案之后 我仍然对如何使用 moment 进行简单比较感到困惑两个不同的时间 我不需要 想要 考虑日期 日期 我的用例是这样的 我正在从配置文件中读取时间表 开始 结束时间 这是使用 Node js
  • 有多少 iPhone 应用程序可以在 Linux 上开发和测试?

    我为客户开发一些 iPhone 应用程序 但我更喜欢在 Linux 机器上工作 我知道您需要在运行 OS X 的计算机上执行某些操作 例如构建最终发行版 在模拟器中运行 iPhone 应用程序等 但我想知道你可以使用普通的 Objectiv
  • 获取图像缩略图文件路径

    我正在尝试获取缩略图paths 而不是位图对象 当我查询这些时 某些缩略图路径由于某种原因为空 我的设备中有1028个缩略图 光标长度确实是1028 但仍然返回空值 我知道有1028个缩略图 因为我检查过 这是我的代码 String pro
  • SQL OVER() 子句 - 何时以及为何有用?

    USE AdventureWorks2008R2 GO SELECT SalesOrderID ProductID OrderQty SUM OrderQty OVER PARTITION BY SalesOrderID AS Total