标签: window-functions

如何在窗口上模拟 array_agg(distinct x) ?

我有一个用作array_agg窗口函数的查询,即带有over (...)子句。我只想获取此数组聚合中的一组不同值,但这在 Postgres 9.4 中并未实现:

对于以下(简化的)查询,

with test_data(day, daytime, song) as (
      select 'MON', 'morning', 'A'
      union all 
      select 'MON', 'morning', 'B'
      union all
      select 'MON', 'afternoon', 'A'
      union all
      select 'TUE', 'afternoon', 'B'
)
select distinct 
    day, 
    first_value(daytime) over w as started,
    array_agg(distinct daytime) over w as daytimes,
    array_agg(distinct song) over w as songs 
from test_data
window w as (partition by day order by daytime ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);
Run Code Online (Sandbox Code Playgroud)

Postgres 返回以下内容:

SQLERROR …
Run Code Online (Sandbox Code Playgroud)

sql postgresql window-functions

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

HSQLDB 中的 PARTITION BY 替代方案

我想使用select *在 HSQLDB 数据库上触发/sf/answers/266040071/中建议的查询,例如

WITH tmpTable AS (
SELECT p.* ,
        ROW_NUMBER()  OVER(PARTITION BY p.groupColumn order by p.groupColumn desc) AS rowCount
  FROM sourceTable p) SELECT * FROM  tmpTable WHERE tmpTable.rowCount = 1
Run Code Online (Sandbox Code Playgroud)

但出现以下错误:

Caused by: org.hsqldb.HsqlException: unexpected token: PARTITION required: )
Run Code Online (Sandbox Code Playgroud)

意味着不支持PARTITION BY 。

我对 HSQLDB 的特定查询有解决方法吗?

sql hsqldb window-functions

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

引用窗口函数中的当前行

是否可以引用窗口分区中的当前行?我想做如下的事情:

SELECT min(ABS(variable - CURRENT.variable)) over (order by criterion RANGE UNBOUNDED PRECEDING)

也就是说,我想在给定的分区中找到最接近当前值的变量。可以做这样的事情吗?

举个例子,来自:

criterion | variable 1 2 2 4 3 2 4 7 5 6

我们将得到:

null 2 0 3 1

谢谢

postgresql window-functions

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

如何在流数据帧上应用滞后函数?

我有一个具有三列 time、col1、col2 的流数据帧。我必须在第 2 列上应用滞后函数。我尝试过以下查询。

val w = org.apache.spark.sql.expressions.Window.oderBy("time")
df.select(col("time"),col("col1"),lag("col3",1).over(w))
Run Code Online (Sandbox Code Playgroud)

但它给出了以下异常

org.apache.spark.sql.AnalysisException: Non-time-based windows are not supported on streaming DataFrames/Datasets
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

提前致谢。

scala window-functions apache-spark apache-spark-sql spark-structured-streaming

5
推荐指数
0
解决办法
1394
查看次数

Oracle SQL 中的 MAX() OVER PARTITION BY

我正在尝试利用 MAX() OVER PARTITION BY 函数来评估我公司购买的特定部件的最新收据。下面是去年一些零件的信息示例表:

| VEND_NUM | VEND_NAME    | RECEIPT_NUM | RECEIPT_ITEM | RECEIPT_DATE |
|----------|--------------|-------------|----------|--------------|
| 100      | SmallTech    | 2001        | 5844HAJ  | 11/22/2017   |
| 100      | SmallTech    | 3188        | 5521LRO  | 12/31/2017   |
| 200      | RealSolution | 5109        | 8715JUI  | 05/01/2017   |
| 100      | SmallTech    | 3232        | 8715JUI  | 11/01/2017   |
| 200      | RealSolution | 2101        | 4715TEN  | 01/01/2017   |
Run Code Online (Sandbox Code Playgroud)

如您所见,第三行和第四行显示同一部件号的两个不同供应商。

这是我当前的查询:

WITH

-- various other subqueries …
Run Code Online (Sandbox Code Playgroud)

sql oracle max window-functions partition-by

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

按时间间隔分区

我正在寻找按日期时间值在分区上运行窗口函数的最佳方法。但是,我不想按确切时间分区,而是希望按日期时间分区,例如彼此相差 15 分钟以内的日期时间。

这是我桌子上的一小部分。

CREATE TABLE my_table(ID VARCHAR(5), in_time DATETIME)

INSERT INTO my_table (ID, in_time) VALUES
('4844', '2017-04-06 10:15:00.000'),
('5221', '2017-11-24 11:18:00.000'),
('5221', '2017-11-24 11:18:00.000'),
('5221', '2017-11-25 14:23:00.000'),
('8486', '2017-10-10 15:30:00.000'),
('8486', '2017-10-10 15:32:00.000'),
('8486', '2017-10-10 15:46:00.000'), -- new row after updating question
('8486', '2017-10-10 16:00:00.000') -- new row after updating question
Run Code Online (Sandbox Code Playgroud)

这是我现在使用的查询:

SELECT *, 
    ROW_NUMBER() OVER(PARTITION BY ID, in_time ORDER BY ID, in_time) AS filter_row
FROM my_table
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这给了我这个:

ID      in_time                     filter_row
4844    2017-04-06 10:15:00.000     1
5221    2017-11-24 11:18:00.000     1 …
Run Code Online (Sandbox Code Playgroud)

sql sql-server datetime window-functions

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

带条件的窗口函数

我有下表。

First_Value满足条件时可以创建窗口函数吗?

例如,当 is = 1 时我需要第一个值并按 id 分区

表A

ID    Date       IS
 1     1/1/18    0
 1     1/2/18    1
Run Code Online (Sandbox Code Playgroud)

我的工作:

   SELECT 
   CASE
   WHEN A.IS = 1 THEN A.DATE END)OVER (PARTITION BY A.ID ORDER BY A.DATE)                
   END FIRST_ATTEMPT_DT
   FROM TABLEA A
Run Code Online (Sandbox Code Playgroud)

sql oracle window-functions

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

如何获得 Snowflake 的累积乘积?

我想计算 Snowflake 中各行的累积乘积。

基本上我的月费是随着时间的推移而倍增的。

(有些数据库有product()相应的 SQL 函数)。

sql window-functions snowflake-cloud-data-platform

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

如何形成允许给定最大间隙的连续日期组?

给定一个像这样的表:

人物ID 联系日 最后联系天数 破折号组
1 2015-02-09 1
1 2015-05-01 81 2
1 2015-05-02 1 2
1 2015-05-03 1 2
1 2015-06-01 29 3
1 2015-08-01 61 4
1 2015-08-04 3 4
1 2015-09-01 28 5
2 2015-05-01 1
2 2015-06-01 31 2
2 2015-07-01 30 3
3 2015-05-01 1
3 2015-05-02 1 1
3 2015-05-04 2 1
3 2015-06-01 28 2
3 2015-06-02 1 2
3 2015-06-06 4 3

另请参阅DB Fiddle 示例

如何识别连续几天的连续但允许最大差距?

数据中的原始列是person_idcontact_day …

sql postgresql window-functions gaps-and-islands

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

PostgreSQL:使用组中先前的 NOT NULL 值向前填充 NULL 值

我正在尝试使用按日期排序的组中的NULL先前值填充多个列(不同列类型 INT、VARCHAR)中的值。NOT NULL考虑下表:

CREATE TABLE IF NOT EXISTS test (
   id VARCHAR,
   date DATE,
   value_1 INT,
   value_2 VARCHAR
);


INSERT INTO test VALUES 
(1, '2022-01-04', 5, 'asdf'),
(1, '2022-01-03', NULL, NULL),
(1, '2022-01-02', NULL, 'def'),
(1, '2022-01-01', 4, NULL),
(2, '2022-01-04', 1, 'a'),
(2, '2022-01-03', NULL, NULL),
(2, '2022-01-02', 2, 'b'),
(2, '2022-01-01', NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想到达这里(请考虑 value_1 --> INTEGER、value_2 字符串):

在此输入图像描述

postgresql window-functions

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