所以我整个晚上都在绞尽脑汁,仍然没有想出一个复杂的答案。希望能帮到你!
所以我有这张表,由唯一的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..我尝试谷歌搜索但没有找到相关的东西...
在没有框架子句的情况下,默认框架取决于 是否存在 ORDER BY 子句:
使用 ORDER BY:默认框架包括从分区开始到当前行的行,包括当前行的所有对等点 (根据 ORDER BY 子句,行等于当前行)。这 默认值相当于此框架规范:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
描述了您所看到的结果