SELECT
    sum(unique1) OVER () AS total,
    sum(unique1) OVER 
    (PARTITION BY four ORDER BY unique1 RANGE BETWEEN 5::int8 PRECEDING AND 6::int2 FOLLOWING),
    unique1,
    four
FROM
    tenk1
WHERE
    unique1 < 10;

返回:

 total | sum | unique1 | four
-------+-----+---------+------
    45 |   4 |       0 |    0
    45 |  12 |       4 |    0
    45 |  12 |       8 |    0
    45 |   6 |       1 |    1
    45 |  15 |       5 |    1
    45 |  14 |       9 |    1
    45 |   8 |       2 |    2
    45 |   8 |       6 |    2
    45 |  10 |       3 |    3
    45 |  10 |       7 |    3
(10 rows)

this的基础上进行微小更改

因为被四个分割使得每个帧只有2或3行.如果你在前面的5个和后面的6个之间,那么我认为在这种情况下,行/范围帧并不重要.我以为Range From,行From都会返回相同的结果.因为前5行、前6行、后6行每帧覆盖了足够的2、3行.

然而,这确实很重要.我想我确实理解了同样的查询,ROWS而不是RANGE.

引用手册中的内容:

在范围或组模式中,当前行的FRAME_START表示帧 从当前行的第一个对等行(窗口的 ORDER BY子句按与当前行相同的方式排序),而 FRAME_END of Current Row表示帧以当前行的 最后一排同行.在行模式中,当前行只表示当前行.

问:如何解读

partition by four order by unique1 rows between 5::int8 preceding and 6::int2 following

推荐答案

The documentation个州:

  • ROWS模式下,偏移量必须产生一个非空、非负的整数,该选项表示帧在当前行之前或之后开始或结束the specified number of rows.

[.]

  • RANGE模式下,这些选项要求ORDER BY子句只指定一列.该偏移量指定帧的the maximum difference between the value of that column in the current row and its value in preceding or following rows.偏移量表达式的数据类型因排序列的数据类型而异.

(重点是我的.)

因此,对于ROWS,您将获得当前行之前的5行和之后的6行.对于RANGE,您将得到unique1比当前行的unique1少5或多6的那些行.

在您的示例中,如果考虑第一行,ROWS BETWEEN ... AND 6 FOLLOWING将包括第三行,但RANGE BETWEEN ... AND 6 FOLLOWING不会,因为8(第三行的值unique1)和0之间的差值大于6.

Sql相关问答推荐

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

如何查找所提供日期范围的所有季度开始日期和结束日期

PostgreSQL 9.6嵌套的INSERT/RETURN语句的CTE性能低得令人无法接受

将结果从一列转换为两行或更多

我可以在SQLite3中使用BLOB作为主键吗?

如何找到一个组合的两个列,这是不是在其他表在ORACLE SQL?

在SELECT中将日期格式转换为双周时段

表函数的作用域和功能

SQL:如果一个表中的日期在另一个表的日期的12个月内,则为是或否

Snowflake 中的分层数据

根据具有特定值的 ID 创建自定义组

如何修复初学者 SQL INNER JOIN 查询错误

JSON_VALUE 不适用于提取的 json 中的嵌套路径

具有多个表 JOINS 的 STRING_AGG 的替代方法 (SQL Server 2016)

将时间戳四舍五入到最近 10 分钟的查询

检索具有相同位置的最小和最大store 数量

Teradata 多个进程的最大进程结束时间捕获

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

在 SQL 的每行选项中 Select 最大值

有没有一种方法可以将始终遵循序列的单个字段的值组合起来,以创建每个 ID 的所有移动?