标签: window-functions

6
推荐指数
1
解决办法
1819
查看次数

H2 数据库是否能够使用聚合函数对 over 子句进行 SQL 查询?

像这样的 SQL

SELECT empno, deptno, 
COUNT(*) OVER (PARTITION BY deptno) DEPT_COUNT FROM emp WHERE deptno IN (20, 30);
Run Code Online (Sandbox Code Playgroud)

非常有用。

我只是想知道在H2中,我们如何实现类似的功能?也许创建一个 java 程序会起作用。但是这个功能会在 H2 数据库的路线图中吗?

sql h2 window-functions

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

在开窗函数中使用 Case ( OVER (Partition))

我正在尝试完成以下任务:

SELECT 
   *,
   CASE WHEN 1 THEN SUM(b.myField) ELSE AVG(b.myField) END OVER (PARTITION BY ID)
FROM tbl a
LEFT JOIN tbl2 b ON a.ID = b.aID
Run Code Online (Sandbox Code Playgroud)

这可能与 SQL Server 中的窗口函数有关吗?

我能够在没有 case 语句的情况下完成以下操作:

SELECT 
   *,
   SUM(b.myField) OVER (PARTITION BY ID)
FROM tbl a
LEFT JOIN tbl2 b ON a.ID = b.aID
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008 window-functions

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

聚合连接的节点/边集

我有一组具有唯一节点的连接边。它们使用父节点连接。考虑以下示例代码和插图:

CREATE TABLE network (
  node integer PRIMARY KEY,
  parent integer REFERENCES network(node),
  length numeric NOT NULL
);
CREATE INDEX ON network (parent);
INSERT INTO network (node, parent, length) VALUES
  (1, NULL, 1.3),
  (2, 1, 1.2),
  (3, 2, 0.9),
  (4, 3, 1.4),
  (5, 4, 1.6),
  (6, 2, 1.5),
  (7, NULL, 1.0);
Run Code Online (Sandbox Code Playgroud)

连通集

在视觉上,可以识别两组边缘。如何使用 PostgreSQL 9.1 识别这两个组并length求和?预期结果显示:

结果

 edges_in_group | total_edges | total_length
----------------+-------------+--------------
 {1,2,3,4,5,6}  |           6 |          7.9
 {7}            |           1 |          1.0
(2 rows)
Run Code Online (Sandbox Code Playgroud)

我什至不知道从哪里开始。我需要自定义聚合或窗口函数吗?我可以WITH RECURSIVE用来迭代收集连接的边吗?我的真实案例是一个有 245,000 …

postgresql aggregate recursive-query common-table-expression window-functions

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

如何仅在连续行上应用聚合函数?

在 PostgreSQL 9.4 上,我试图在一些连续的行上实现我称之为“聚合函数”的东西。例子:

输入数据:

recipe  prod1   prod2   timestamp
0       5       4       2015-07-02 08:10:34.357
0       2       7       2015-07-02 08:13:45.352
0       7       0       2015-07-02 08:16:22.098
1       3       2       2015-07-02 08:22:14.678
1       9       4       2015-07-02 08:22:56.123
2       2       6       2015-07-02 08:26:37.564
2       1       7       2015-07-02 08:27:33.109
2       0       8       2015-07-02 08:31:11.687
0       3       5       2015-07-02 08:40:01.345
1       4       2       2015-07-02 08:42:23.210
Run Code Online (Sandbox Code Playgroud)

期望的输出:

recipe  prod1_sum   prod2_avg   timestamp_first             timestamp_last
0       14          3.6666      2015-07-02 08:10:34.357     2015-07-02 08:16:22.098
1       12          3           2015-07-02 08:22:14.678     2015-07-02 08:22:56.123
2 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions window-functions

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

红移中的窗函数

我有一些看起来像这样的数据:

CustID  EventID     TimeStamp
1       17          1/1/15 13:23
1       17          1/1/15 14:32
1       13          1/1/25 14:54
1       13          1/3/15 1:34
1       17          1/5/15 2:54
1       1           1/5/15 3:00
2       17          2/5/15 9:12
2       17          2/5/15 9:18
2       1           2/5/15 10:02
2       13          2/8/15 7:43
2       13          2/8/15 7:50
2       1           2/8/15 8:00
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 row_number 函数使其看起来像这样:

CustID  EventID     TimeStamp      SeqNum
1       17          1/1/15 13:23    1
1       17          1/1/15 14:32    1
1       13          1/1/25 14:54    2
1       13          1/3/15 1:34     2
1 …
Run Code Online (Sandbox Code Playgroud)

sql window-functions amazon-redshift

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

滞后以获取自前一个空值以来的第一个非空值

下面是我试图在 Redshift 数据库中实现的示例。

我有一个变量current_value,我想创建一个新列value_desired

  • 一样 current_value前一行为空相同
  • 如果前一行非空,则等于前一个非空值

这听起来像是一项简单的任务,但我还没有找到方法来做到这一点。

row_numb     current_value   value_desired
1
2
3            47              47
4
5            45              45
6
7
8            42              42
9            41              42
10           40              42
11           39              42
12           38              42
13
14           36              36
15
16
17           33              33
18           32              33
Run Code Online (Sandbox Code Playgroud)

我已经尝试过 LAG() 函数,但我只能获得以前的值(不是“非空”块中的第一个值),这是我的看法:

SELECT *
    , CASE WHEN current_value is not null and LAG(current_value) is null THEN current_value
           WHEN current_value is not null and LAG(current_value) is …
Run Code Online (Sandbox Code Playgroud)

sql lag window-functions amazon-redshift

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

如何在 Postgres 的窗口函数中获取 mode()?

我试图获取mode()分组数据集的 ,但没有对结果进行分组。(使用 Postgres 9.5,如果需要可以升级。)

例如,用户有一个“最喜欢的颜色”,并且属于一个组。获取mode()组内具有“最喜欢的颜色”的用户列表。

窗口函数适用于大多数聚合,但mode()似乎是与窗口函数不兼容的例外。有没有其他方法可以解决这个问题?这是我到目前为止一直在玩的东西......

有效但给出分组结果,我正在寻找未分组的结果:

SELECT group_id, 
    mode() WITHIN GROUP (ORDER BY color)
FROM users
GROUP BY group_id;
Run Code Online (Sandbox Code Playgroud)

无效的语法(只是我试图完成的一个例子):

SELECT id, color, group_id, 
    mode(color) OVER (PARTITION BY group_id)
FROM users;
Run Code Online (Sandbox Code Playgroud)

或者:

SELECT id, color, group_id, 
    mode() WITHIN GROUP (ORDER BY color) OVER (PARTITION BY group_id)
FROM users;
Run Code Online (Sandbox Code Playgroud)

我尝试使用横向连接,但如果不在连接WHERE内部和外部重新迭代我的子句,就无法使其正常工作(当此查询变得更复杂时,我不希望这样做):

SELECT u1.id, u1.group_id, u1.color, mode_color
FROM users u1
LEFT JOIN LATERAL
    (SELECT group_id, mode() WITHIN GROUP (ORDER BY color) as mode_color
     FROM …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions greatest-n-per-group window-functions

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

Spark SQL 窗口超过两个指定时间边界之间的间隔 - 3 小时到 2 小时前

使用两个预定义边界在 Spark SQL 中指定窗口间隔的正确方法是什么?

我试图在“3 小时前到 2 小时前”的窗口中总结我的表中的值。

当我运行此查询时:

select *, sum(value) over (
partition by a, b
order by cast(time_value as timestamp)
range between interval 2 hours preceding and current row
) as sum_value
from my_temp_table;
Run Code Online (Sandbox Code Playgroud)

那个有效。我得到了我期望的结果,即落入 2 小时滚动窗口的值的总和。

现在,我需要的是让滚动窗口不绑定到当前行,而是考虑 3 小时前和 2 小时前之间的行。我试过:

select *, sum(value) over (
partition by a, b
order by cast(time_value as timestamp)
range between interval 3 hours preceding and 2 hours preceding
) as sum_value
from my_temp_table;
Run Code Online (Sandbox Code Playgroud)

但我得到extraneous input 'hours' expecting {'PRECEDING', …

window-functions apache-spark apache-spark-sql

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

如何使 LAG() 忽略 SQL Server 中的 NULLS?

有谁知道如何用字符串替换列中的空值,直到它遇到一个新字符串,然后该字符串替换它下面的所有空值?我有一个看起来像这样的专栏

原始列:

PAST_DUE_COL           
91 or more days pastdue        
Null
Null
61-90 days past due          
Null
Null
31-60 days past due
Null
0-30 days past due
Null       
Null
Null            
Run Code Online (Sandbox Code Playgroud)

预期结果栏:

PAST_DUE_COL           
91 or more days past due        
91 or more days past due
91 or more days past due
61-90 days past due          
61-90 days past due 
61-90 days past due 
31-60 days past due
31-60 days past due
0-30 days past due
0-30 days past due      
0-30 days past due …
Run Code Online (Sandbox Code Playgroud)

sql sql-server window-functions gaps-and-islands sql-null

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