标签: window-functions

窗口函数中的 RANGE 子句错误

我正在尝试RANGE在窗口函数中使用 postgres子句将窗口动态设置为过去 4 周,不包括当前日期。这是我的尝试:

SELECT date("aa0"."created_at") AS "Day of Created At",
       "aa0"."user_id" AS "User Id",
       count (*) activities_today,
       count(*) over (PARTITION BY "aa0"."user_id"
                      ORDER BY date("aa0"."created_at") ASC
                      RANGE BETWEEN date("aa0"."created_at" - interval '4 weeks')
                                    AND 
                                    date("aa0"."created_at" - interval '1 day')
                ) active_days_past_4_weeks
FROM "public"."activity_activity" AS "aa0"
GROUP BY date("aa0"."created_at"), "aa0"."user_id" 
ORDER BY "Day of Created At" ASC LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

ERROR: syntax error at or near ")" Position: 459
Run Code Online (Sandbox Code Playgroud)

如果我使用ROWS而不是RANGE它有效,但这不是正确的逻辑,因为不能保证每天都会有一行:

SELECT date("aa0"."created_at") AS "Day …
Run Code Online (Sandbox Code Playgroud)

postgresql window-functions postgresql-9.3

5
推荐指数
1
解决办法
2669
查看次数

按引用表中的相关行数排序

假设有两个表:

用户

id [pk] |   name
--------+---------
      1 | Alice
      2 | Bob
      3 | Charlie
      4 | Dan
Run Code Online (Sandbox Code Playgroud)

电子邮件

 id | user_id | email 
----+---------+-------
  1 |       1 | a.1
  2 |       1 | a.2
  3 |       2 | a.3
  4 |       2 | b.1
  5 |       2 | a.4
  6 |       2 | a.5
  7 |       3 | b.2
  8 |       3 | a.6
Run Code Online (Sandbox Code Playgroud)

随着查询我要检索:

  • 用户的 ID 和名称
  • 用户的电子邮件数
  • 用户的电子邮件及其 ID

我希望输出按电子邮件数量降序排列并过滤,仅包括以“a”开头的电子邮件。没有电子邮件的用户也应包括在内 - 将他们的电子邮件计数视为0。 …

postgresql join window-functions postgresql-9.3

5
推荐指数
1
解决办法
223
查看次数

可扩展查询前 x 天内的事件运行计数

我已经在stackoverflow上发布了这个问题,但我想我可能会在这里得到更好的答案。
我有一个表存储用户发生的数百万个事件:

                                       Table "public.events"
   Column   |           Type           |                         Modifiers                         
------------+--------------------------+-----------------------------------------------------------
 event_id   | integer                  | not null default nextval('events_event_id_seq'::regclass)
 user_id    | bigint                   | 
 event_type | integer                  | 
 ts         | timestamp with time zone | 
Run Code Online (Sandbox Code Playgroud)

event_type 有 5 个不同的值、数百万用户以及每个用户每个 event_type 的不同事件数,通常范围为 1 到 50。

数据样本:

+-----------+----------+-------------+----------------------------+
| event_id  | user_id  | event_type  |         timestamp          |
+-----------+----------+-------------+----------------------------+
|        1  |       1  |          1  | January, 01 2015 00:00:00  |
|        2  |       1  |          1  | January, 10 2015 00:00:00  | …
Run Code Online (Sandbox Code Playgroud)

postgresql performance scalability window-functions postgresql-performance

5
推荐指数
1
解决办法
3210
查看次数

将多个时间线的两个事件表合并为一个结果集

这个问题是我之前提出的一个过于简化的问题的扩展。更准确的示例在此 SQLFiddle中演示,我演示了一个有效(但速度较慢)的解决方案,然后尝试将先前的答案调整为实际问题。

实际问题是因为这两个表包含多个时间线的事件。

CREATE TABLE foo (ts int, id text, foo text);
INSERT INTO foo (ts, id, foo)
VALUES
    (1, 'A', 'Lorem'),
    (1, 'B', 'ipsum'),
    (4, 'B', 'dolor'),
    (5, 'A', 'sit'),
    (8, 'A', 'amet'),
    (8, 'B', 'consectetur');

CREATE TABLE bar (ts int, id text, bar text);
INSERT INTO bar (ts, id, bar)
VALUES
    (1, 'A', 'adipiscing'),
    (5, 'B', 'elit'),
    (6, 'A', 'sed'),
    (9, 'B', 'do ');
Run Code Online (Sandbox Code Playgroud)

每个表都有时间线“A”和“B”的事件。目标是将结果组合成单个结果集,显示每个时间线的“状态”。两条时间线是正交的。

ts id foo 栏
1 Lorem adipiscing …

postgresql join window-functions

5
推荐指数
1
解决办法
948
查看次数

计算上一行的百分比变化

我刚刚进入了窗口函数的世界。我有一个类似的问题要解决这个问题

我有这张桌子:

桌子

最后一列(%Grown)由下式给出:

-(1 - price of row 2 / price of row 1) * 100
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的所有信息都与所有行的总和、平均值有关。我不知道如何绑定两行,所以我可以计算百分比。

我如何将其翻译成 SQL?

postgresql window-functions

5
推荐指数
2
解决办法
1万
查看次数

使用 UPDATE 对表行进行排序并保存行号

我的 Postgres 9.5 有一个movimientos包含以下数据的表:

| id | concepto | movimiento | numero | orden |
|  1 | AJUSTE 1 |       2542 |      0 |     2 |
|  2 | APERTURA |      12541 |      0 |     1 |
|  3 | AJUSTE 2 |       2642 |      0 |     2 |
|  4 | CIERRE   |      22642 |      0 |     3 |
Run Code Online (Sandbox Code Playgroud)

我需要根据orden字段对记录进行编号并将这些数字保留在numero字段中,因为我需要这些数据numero在报告中进行排序和搜索。例子:

| id | concepto | movimiento | numero | orden …
Run Code Online (Sandbox Code Playgroud)

postgresql performance window-functions update query-performance

5
推荐指数
1
解决办法
4295
查看次数

如果 x 是日期,`(ORDER BY x RANGE BETWEEN n PRECEDING...)` 的含义是什么?

在另一个线程中:

/sf/ask/2643176161/

OP 想要过去 365 天的滑动平均值。ROWS BETWEEN ...如果可以保证每天恰好发生一次,则使用会很好,但这里的情况并非如此。RANGE BETWEEN ...看起来很合适,但我不清楚它在 DB2 中的含义。不确定 db2 没有INTERVAL类型是否重要,但用标记的持续时间模仿它。

文档说:(https://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0023461.html

无符号常量 PRECEDING

指定当前行之前的行数范围或行数。如果指定了 ROWS,则 unsigned-constant 必须为零或表示行数的正整数。如果指定了 RANGE,则 unsigned-constant 的数据类型必须与 window-order-clause 的 sort-key-expression 的类型相当。sort-key-expression 只能有一个,并且 sort-key-expression 的数据类型必须允许减法。如果 group-bound1 是 CURRENT ROW 或 unsigned-constant FOLLOWING,则不能在 group-bound2 中指定该子句。

无符号常量如下

指定当前行之后的行数范围或行数。如果指定了 ROWS,则 unsigned-constant 必须为零或表示行数的正整数。如果指定了 RANGE,则 unsigned-constant 的数据类型必须与 window-order-clause 的 sort-key-expression 的类型相当。sort-key-expression 只能有一个,并且 sort-key-expression 的数据类型必须允许添加。

DB2 允许以下结构:

values current_date - 1
Run Code Online (Sandbox Code Playgroud)

默认单位日期是天,所以这意味着:

values current_date - 1 day
Run Code Online (Sandbox Code Playgroud)

鉴于此,我希望此示例能够正常工作:

create table test 
( …
Run Code Online (Sandbox Code Playgroud)

db2 window-functions db2-10.5 db2-luw

5
推荐指数
1
解决办法
975
查看次数

特殊累积和基于前一行的行数据转换

根据对这个问题回答,我设法产生了以下输出以获得运行的值总和:

id      creation                    operation       value       running sum
SyJw-c  2016-09-01 00:11:08.307419  positive_op_1   1.33        28.82
SyJw-c  2016-08-21 08:32:54.431662  negative_op_1   -1          27.49
SyJw-c  2016-08-18 07:38:33.878365  positive_op_2   1           28.49
SyJw-c  2016-08-14 18:12:03.599797  negative_op_1   -1          27.49
SyJw-c  2016-08-02 15:44:29.693303  positive_op_1   1.33        28.49
SyJw-c  2016-07-31 12:08:50.659905  override_op_1   4.66        27.16
SyJw-c  2016-06-26 06:53:54.537603  negative_op_1   -3.5        22.5
SyJw-c  2016-05-31 13:34:08.005687  negative_op_1   -1          26
SyJw-c  2016-05-31 13:34:04.776970  negative_op_1   -1          27
SyJw-c  2016-05-31 11:27:09.502983  override_op_2   28          28
Run Code Online (Sandbox Code Playgroud)

我的情况更复杂。我不仅需要对这些值求和,还需要能够首先根据其下方行的运行总和对某些行执行转换。

我先解释一下动机:

目前我有一个带有增量、减量和覆盖操作的表。我想将数据移植到一个只有增量和减量操作的表中,这样我就可以直接总结这些值。我不希望维护旧表,只是一种将数据迁移到更简单模型的方法,因此只将数据附加到新表。

采用上面的“原始”表,我想编写一个查询(我在 postgresql 9.5 上运行)并获得一个与下面非常相似的表。(相反,我想知道我正在尝试的是 …

postgresql migration window-functions

5
推荐指数
1
解决办法
213
查看次数

窗口函数:Rows Unbounded Preceeding 的目的是什么?

在窗口函数中使用 Rows Unbounded Preceeding 子句的目的是什么?我想我明白它基本上是说在汇总聚合函数时不限制回溯多远,但这与根本不使用该子句有什么不同?

您能否提供一个示例来说明以下之间的区别:

SUM(ColumnA) OVER (PARTITION BY ColumnB ORDER BY ColumnC DESC ROWS UNBOUNDED PRECEEDING)

SUM(ColumnA) OVER (PARTITION BY ColumnB ORDER BY ColumnC DESC)

注意:我的问题是在以下行没有上限的上下文中。

sql-server window-functions sql-server-2017

5
推荐指数
1
解决办法
407
查看次数

Postgres 可以向后扫描索引吗?

我们使用 Amazon RDS 实例

x86_64-pc-linux-gnu 上的 PostgreSQL 11.13,由 gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-12) 编译,64 位

我有一个简单的经典每组前 1 名查询。我需要获取每个 的历史记录中的最新项目creativeScheduleId

这是表和索引的定义:

CREATE TABLE IF NOT EXISTS public.creative_schedule_status_histories (
  id serial PRIMARY KEY,
  "creativeScheduleId" text NOT NULL,
  -- other columns
);

CREATE UNIQUE INDEX IF NOT EXISTS idx_creativescheduleid_id
  ON public.creative_schedule_status_histories ("creativeScheduleId" ASC, id ASC);
Run Code Online (Sandbox Code Playgroud)

当引擎的查询排序时id ASC仅读取索引并且不执行任何额外的排序:

EXPLAIN (ANALYZE) 
SELECT history.id, history."creativeScheduleId"
FROM  (
    SELECT cssh.id, cssh."creativeScheduleId"
         , ROW_NUMBER() OVER (PARTITION BY cssh."creativeScheduleId"
                              ORDER BY cssh.id ASC) …
Run Code Online (Sandbox Code Playgroud)

postgresql index execution-plan window-functions greatest-n-per-group

5
推荐指数
1
解决办法
516
查看次数