ORDER BY中的字段影响窗口函数的结果

2023-12-28

我有简单的 T-SQL 查询,它计算所有记录的行号、行数和总数量:

DECLARE @t TABLE
(
    id        varchar(100),
    volume    float,
    prev_date date
);

INSERT INTO @t VALUES
('0318610084', 100, '2019-05-16'),
('0318610084', 200, '2016-06-04');

SELECT
    row_num    = ROW_NUMBER() OVER (PARTITION BY id ORDER BY prev_date),
    rows_count = COUNT(*) OVER (PARTITION BY id ORDER BY prev_date),
    vol_total  = SUM(volume) OVER (PARTITION BY  id ORDER BY prev_date),
    *
FROM @t;

我得到以下结果:

然而,这不是我所期望的:在所有两行中行数必须是 2 并且总成交量必须是 300:

解决方法是添加无界前导和无界后继之间的行。不过,我想,一定有其他方式.

最终我发现 ORDER BY 子句必须使用id场而不是上一个日期 field:

row_num    = ROW_NUMBER() OVER (PARTITION BY id ORDER BY id),
rows_count = COUNT(*) OVER (PARTITION BY id ORDER BY id),
vol_total  = SUM(volume) OVER (PARTITION BY id ORDER BY id)

进行此更改后,查询的输出将符合预期。 但!我不明白为什么会这样?顺序如何影响分区?


对于聚合函数,通常不需要在窗口定义中具有顺序,除非您想以有序的方式一次进行一个聚合,这就像运行总计。只需删除订单即可解决问题。

如果我想从另一种方式解释它,它就像一个窗口,当您移动到另一行时,它会逐行扩展。它从第一行开始,计算从之前(第一行中只是当前行!)到行位置的所有行的聚合。

如果删除顺序,将为窗口定义中的所有行计算聚合,并且应用窗口的顺序不会生效。

您可以更改窗口定义中的顺序以查看其效果。

当然,排名函数需要顺序,这一点仅适用于聚合。

DECLARE @t TABLE
(
    id        varchar(100),
    volume    float,
    prev_date date
);

INSERT INTO @t VALUES
('0318610084', 100, '2019-05-16'),
('0318610084', 200, '2016-06-04');

SELECT
   row_num    = ROW_NUMBER() OVER (PARTITION BY id ORDER BY prev_date),
   rows_count = COUNT(*) OVER (PARTITION BY id),
   vol_total  = SUM(volume) OVER (PARTITION BY  id),
   *
FROM @t;

在 SqlServer 2012 之后添加的聚合窗口中启用顺序,并且它不是 2005 年该功能的第一个版本的一部分。

对于聚合上窗口函数的顺序的详细解释,这是一个很大的帮助:生成移动平均值和累计总计 - SqlServer 文档 https://learn.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017#c-producing-a-moving-average-and-cumulative-total

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

ORDER BY中的字段影响窗口函数的结果 的相关文章

  • 如何更新 SQL Server 2000 中的 text 或 ntext 字段

    所以我需要更新一个文本字段 在下面使用时 UPDATE 语句或 WRITETEXT 语句都不起作用 CREATE TABLE MyTable IDField int MyField text INSERT INTO MyTable IDFi
  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • 删除原始数据中部分重复的记录

    我需要删除表中时间间隔为 1 或 2 分钟或相同且必须相同的所有记录ID但保留第一个记录 ID Time SN SD WE FW 10 2014 06 30 19 17 37 000 I 0 100 0 10 2014 06 30 19 1
  • Sql 查询:Sum,表中所有可能的行组合

    SQL Server 2008 R2 表结构示例 create table TempTable ID int identity value int insert into TempTable values 6 insert into Tem
  • 为什么某些字符无法从 CFQUERY 正确注入到 SQL Server?

    我有一个在 Lucee 上运行的 Coldfusion 应用程序 它连接到 SQL Server 数据库 当我直接在 SQL Server 管理器中运行以下查询时 UPDATE article SET content 20m WHERE i
  • 时间分组的 TSQL 滚动平均值

    这是以下内容的后续内容 TSQL 按 N 秒分组 https stackoverflow com questions 5513176 tsql group by n seconds 我得到了我想要的东西 但没有要求正确的东西 如何获得 1
  • t sql中的相对路径?

    如何获取t sql中的相对路径 举个例子 sql文件位于文件夹中D temp 我想获取文件夹中文件hello txt的路径D temp App Data 如何使用相对路径引用 假设我正在 SQL Server Management Stud
  • (SQL) 识别字段中字符串格式多次出现的位置

    我需要将叙述字段 自由文本 拆分为多行 目前的格式如下 Case Reference Narrative XXXX XX 123456 Endless Text up to 50k characters 在作为文本的叙述字段中 各个条目 当
  • ASP.NET 网站上的 XSS 攻击 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我遇到了很大的麻烦 请帮忙 我的网站
  • 从存储过程中的动态 SQL 获取结果

    我正在编写一个存储过程 需要在过程中动态构造 SQL 语句以引用传入的表名称 我需要让这个 SQL 语句返回一个结果 然后我可以在整个过程的其余部分中使用该结果 我尝试过使用临时表和所有内容 但我不断收到一条消息 提示我需要声明变量等 例如
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之
  • 从一个sql服务器选择到另一个sql服务器?

    我想将一台服务器 Data Old S1 中的一个表 T1 在 DB1 中 中的数据选择到另一台服务器 Data Latest S2 中的另一个表 T2 在 DB2 中 中的数据 我怎样才能做到这一点 请注意服务器的命名方式 查询也应该考虑
  • PHP DBlib PDO 问题

    我正在尝试通过 php 连接到 MSSQL 服务器 但我的 pdo 连接给我带来了困难和我不太理解的错误 我在下面粘贴的代码一周前运行得很好 突然间它就停止了 没有任何人进行任何更改 我仍然可以连接到服务器并直接从命令行运行查询 但我在 p
  • 为什么查询优化器完全忽略索引视图索引?

    SQL 小提琴 http sqlfiddle com 6 d4496 1 http sqlfiddle com 6 d4496 1 数据是为您的实验预先生成的 有一个明显的表格 CREATE TABLE Entity ID int Clas
  • 在 C# 中将平面数据库结果集转换为分层对象集合

    我有一个数据库查询 它以平面格式返回分层数据 例如客户 订单和订单项目 只是一个例子 我的数据不同 如何将其转换为分层对象集合 即客户对象的集合 其中每个客户对象都有订单对象的集合 每个订单对象都有订单项目对象的集合 这只是循环遍历每个项目
  • SqlException超时未达到

    我们的服务器有时会抛出这个众所周知的异常 超时已过 操作完成之前超时时间已过 或者服务器未响应 当服务器处理大请求时 这种情况会在压力下发生 我做了一些研究 发现我可以改变连接字符串连接超时设置和 或SqlCommand 超时数据读取器属性
  • 该驱动程序未配置为集成身份验证

    尝试使用以下命令将我的 Java Web 应用程序与 MS SQL 服务器连接sqljdbc41 for jdk 1 8 这是数据库连接代码 Connection connection String url jdbc sqlserver l
  • 使用 t-sql 检索已过滤的存储过程列表

    我正在尝试获取 t sql 中的存储过程列表 我正在使用该行 exec sys sp stored procedures 我想过滤回结果 所以我只获取用户创建的存储过程 我想过滤掉 sp dt fn xp 以及其他所有我不感兴趣的系统存储过
  • 在 SSIS 中使用合并任务的指南

    我有一个包含三个字段的表 其中一个是身份字段 我需要从具有其他两个字段的源中添加一些新记录 我正在使用SSIS 我认为我应该使用合并工具 因为其中一个源不在本地数据库中 但是 我对合并工具和正确的过程感到困惑 我有一个源 一个 Oracle
  • 计算树中值的总和(递归查询)

    我在表员工 id name parentid 中有树结构 并且该表可以嵌套 employees 与另一个具有列 id employeeid quantity 的 Sales 表是一对多关系 每个员工都有销售数量 我想计算每个员工以及儿童员工

随机推荐

  • Access-Control-Allow-Origin 标头不起作用

    即使我已将其添加到我的 htaccess 文件中 Header add Access Control Allow Origin 这在我的 apache 配置中 在部分内部和外部
  • 如何在 Django 中将 get_context_data 与 TemplateView 一起使用[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试做这样的事情 class
  • Android Studio 模块依赖于另一个模块的测试

    我正在尝试让 Gradle Java 插件执行 Android 项目中存在的 jUnit 测试 我的解决方案是创建第二个应用 Java 插件的模块 并将测试源集设置为应用程序模块的 src test 目录 测试模块的build gradle
  • Haskell:I/O 和从函数返回

    请耐心等待 因为我对函数式编程和 Haskell 非常陌生 我试图在 Haskell 中编写一个函数 它接受一个整数列表 打印所述列表的头部 然后返回列表的尾部 该函数的类型必须是 Integer gt Integer 为了提供一些上下文
  • 错误:禁止 您的客户端无权从此服务器获取 URL /api/app

    我在访问 Firebase 帐户内的 JSON api 时遇到问题 我将在终端中输入 firebase deploy 它将返回以下 url https myProjectID firebaseapp com https myProjectI
  • C++:Hbitmap/BITMAP 到 .bmp 文件中[重复]

    这个问题在这里已经有答案了 好吧 整个故事是 我试图在 C 中使用 Leptonica Tesseract OCR 来截取屏幕截图 将其保存到 bmp 文件 然后将其加载回 OCR 我不需要经常这样做 但由于我似乎无法将屏幕截图数据直接复制
  • Android 自定义控件中的数据绑定

    在官方 android 文档中 有一些如何在片段和活动中使用数据绑定的指导 然而我有相当复杂的选择器和大量的设置 就像是 class ComplexCustomPicker extends RelativeLayout PickerView
  • 奇怪的边框颜色问题

    我正在创建一个用户顶部列表 其中使用 CSS3 边框为排名数字创建白色边框 可以在这里查看 http www cphrecmedia dk musikdk stage channelfans php http www cphrecmedia
  • Python 在类之间传递变量

    我正在尝试为游戏创建角色生成向导 在一堂课中 我计算了角色的属性 在不同的班级中 我根据角色的属性向用户显示哪些专业可用 但是 我不记得如何在不同类之间传递变量 这是我所拥有的示例 class BasicInfoPage wx wizard
  • 如何在Silex中实现断点续传

    In silex http silex sensiolabs org doc usage html sending a file我可以这样做来强制下载文件 use Symfony Component HttpFoundation Reque
  • 将对象转换为单元素列表的快速方法?

    什么是最快的C 2 0从单个对象创建一个单元素列表 eg MyObject obj new MyObject List
  • 如何捕获Flex中的所有异常?

    当我在调试 Flash 播放器中运行 Flex 应用程序时 一旦发生意外情况 就会弹出异常 然而 当客户使用该应用程序时 他不会使用调试闪存播放器 在这种情况下 他不会弹出异常 但他的 UI 无法正常工作 因此 出于可支持性的原因 我希望捕
  • 如何触发点击按钮

    I ve 我需要使用 AngularJS 触发单击此页面上的 立即购买 按钮 我已经尝试过以下方法来单击内容脚本 myscript js 中的 立即购买 但不起作用 angular element ul form button contai
  • 是否有文档将 matplotlib 的有状态 pyplot API 映射到面向对象的等效项?

    我更喜欢使用 Matplotlib 的面向对象 API 直接对图形和轴进行操作 而不是使用matplotlib pyplot命令 然而 我经常发现通过以下方式更容易找到有关如何做某事的文档pyplot界面 在这些情况下 找出相关的内容将非常
  • 无法从 bash 脚本获取 ~/.bashrc

    在我的脚本中 我尝试获取两个文件来获取变量 但它无法获取定义的变量 bashrc OS Ubuntu Desktop 20 04 2 LTS cat debug sh usr bin env bash cat gt env sh lt lt
  • 显示调整大小后的图像

    我正在尝试使用以下功能调整大小和图像 function resize image file w h crop FALSE list width height getimagesize file r width height if crop
  • auto.register.schemas 设置为 false 无法按预期工作

    auto register schemas false 没有像我预期的那样工作 如果我阅读文档 它应该阻止生产者注册新模式 https docs confluence io platform current schema registry
  • 无法在 Java 中使用 Batik 编辑 SVG?

    我有一张学生卡 SVG 其中包含我想通过 Java 编辑的姓名 id 和其他字段 当用户使用 GUI 输入它们时 我已使用 Batik 成功解析了 SVG 但打开 SVG 文件时看不到在 SVG 文件中所做的更改 String parser
  • 如何使用 Puppeteer 暂停并等待用户输入?

    我需要做Puppeteer暂停并等待用户输入username and password在继续之前 它是一个nodejs8 12 0 应用程序 async gt const browser await puppeteer launch hea
  • ORDER BY中的字段影响窗口函数的结果

    我有简单的 T SQL 查询 它计算所有记录的行号 行数和总数量 DECLARE t TABLE id varchar 100 volume float prev date date INSERT INTO t VALUES 0318610