COUNT(*) OVER(ORDER BY...) - 这个窗口函数的结果是违反直觉的

问题描述 投票:0回答:1

所以我整个晚上都在绞尽脑汁,仍然没有想出一个复杂的答案。希望能帮到你!

所以我有这张表,由唯一的ID和注册时间组成(200个查询):

|用户 ID |注册时间 | |--------------------------------|--------------------| | 1| '2021-01-01' | | 2| '2020-01-01' | | 3| '2019-01-01' | | 4| '2018-01-01' | ...减少到 200 个 ID

此窗口函数调用 SELECT user_id, count(*) OVER(ORDER BY Registration_time desc) as cnt, 来自用户的注册时间;

...返回以下内容(中间属性下降到 200 行):

用户ID 注册时间 注册时间
1 1 '2021-01-01'
2 2 '2020-01-01'
3 3 '2019-01-01'
4 5 '2018-01-01'
5 5 '2018-01-01'
6 6 '2017-01-01'

因此,我看到 COUNT(*) 对每一行进行编号(按照指令,根据注册时间降序),并为每个重复查询将其增加 1。

怎么样?我对 COUNT 的了解是,它计算给定表中的行数。我对窗口函数的了解 - 特别是没有 PARTITION BY 的窗口函数 - 是它们将所有行收集在一组中。

COUNT(*) 在这里所做的事情,确实类似于 SUM(1) OVER(ORDER BY ... rows unboundedleading) 所做的事情(如果我错了,请纠正我)

所以,我期望的是,每一行都是 1...但是,我看到的是一个算术序列...

我想知道它到底是如何工作的?提前非常感谢!

P.S..我尝试谷歌搜索但没有找到相关的东西...

sql mysql window-functions
1个回答
0
投票

摘自MySQL 8.0 窗口函数框架规范

在没有框架子句的情况下,默认框架取决于 是否存在 ORDER BY 子句:

使用 ORDER BY:默认框架包括从分区开始到当前行的行,包括当前行的所有对等点 (根据 ORDER BY 子句,行等于当前行)。这 默认值相当于此框架规范:

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

描述了您所看到的结果

© www.soinside.com 2019 - 2024. All rights reserved.