标签: window-functions

窗口函数和更多"本地"聚合

假设我有这个表:

select * from window_test;

 k | v
---+---
 a | 1
 a | 2
 b | 3
 a | 4
Run Code Online (Sandbox Code Playgroud)

最终我想得到:

 k | min_v | max_v
---+-------+-------
 a | 1     | 2
 b | 3     | 3
 a | 4     | 4
Run Code Online (Sandbox Code Playgroud)

但我会很高兴得到这个(因为我可以很容易地过滤它distinct):

 k | min_v | max_v
---+-------+-------
 a | 1     | 2
 a | 1     | 2
 b | 3     | 3
 a | 4     | 4
Run Code Online (Sandbox Code Playgroud)

使用PostgreSQL 9.1+窗口函数可以实现这一点吗?我试图了解我是否可以使用单独的分区来处理k=a此示例中的第一次和最后一次(按顺序排列v).

postgresql common-table-expression window-functions

7
推荐指数
1
解决办法
1402
查看次数

总计一个表的每3行

我有以下查询来计算每分钟的所有数据.

$sql= "SELECT COUNT(*) AS count, date_trunc('minute', date) AS momento
FROM p WHERE fk_id_b=$id_b GROUP BY date_trunc('minute', date) 
ORDER BY momento ASC";
Run Code Online (Sandbox Code Playgroud)

我需要做的是获得每行的计数总和以及过去2分钟的计数.

For example with the result of the $sql query above
|-------date---------|----count----|
|2012-06-21 05:20:00 |      12     |
|2012-06-21 05:21:00 |      14     |
|2012-06-21 05:22:00 |      10     |
|2012-06-21 05:23:00 |      20     |
|2012-06-21 05:24:00 |      25     |
|2012-06-21 05:25:00 |      30     |
|2012-06-21 05:26:00 |      10     |  

I want this result:

|-------date---------|----count----|
|2012-06-21 05:20:00 |      12     |   
|2012-06-21 …
Run Code Online (Sandbox Code Playgroud)

postgresql group-by sum rows window-functions

7
推荐指数
3
解决办法
5343
查看次数

休眠是否支持count(*)over()

我试图阻止必须为count创建一个单独的查询,为实际查询创建一个查询.我发现是SesssionImpl ::的createQuery花费大量的时间进行复杂的查询,并结合数和主查询然后我就可以消除一个电话的createQuery.

在SQL中,我可以做类似的事情

select count(*) over(), col_A, col_B 
from TABLE_XX 
where col_C > 1000
Run Code Online (Sandbox Code Playgroud)

这可以在休眠中实现吗?

(我试图避免使用本机sql并坚持使用HQL和分离标准.使用本机SQL会破坏使用hibernate的目的.我的系统必须同时支持Oracle和Sybase)

java sql hibernate window-functions

7
推荐指数
1
解决办法
1768
查看次数

如何在窗口函数中使用环形数据结构

我有数据以环形结构(或循环缓冲区)排列,也就是说它可以表示为循环的序列:...- 1-2-3-4-5-1-2-3 -... .看到这张图片,了解一个5部分的戒指:

在此输入图像描述

我想创建一个窗口查询,可以将滞后和铅项目组合成一个三点数组,但我无法弄清楚.例如,在5部分环的第1部分,滞后/超前序列是5-1-2,或者部分4是3-4-5.

这是一个两个环的示例表,它们具有不同数量的部件(每个环总是多于三个):

create table rp (ring int, part int);
insert into rp(ring, part) values(1, generate_series(1, 5));
insert into rp(ring, part) values(2, generate_series(1, 7));
Run Code Online (Sandbox Code Playgroud)

这是一个几乎成功的查询:

SELECT ring, part, array[
    lag(part, 1, NULL) over (partition by ring),
    part,
    lead(part, 1, 1) over (partition by ring)
    ] AS neighbours
FROM rp;

 ring | part | neighbours
------+------+------------
    1 |    1 | {NULL,1,2}
    1 |    2 | {1,2,3}
    1 |    3 | {2,3,4}
    1 |    4 | {3,4,5} …
Run Code Online (Sandbox Code Playgroud)

sql postgresql circular-buffer circular-list window-functions

7
推荐指数
1
解决办法
492
查看次数

为什么Window函数失败并且"Window function X不采用帧规范"?

我正在尝试在pyspark 1.4.1中使用Spark 1.4 窗口函数

但主要是错误或意外结果.这是一个我认为应该工作的非常简单的例子:

from pyspark.sql.window import Window
import pyspark.sql.functions as func

l = [(1,101),(2,202),(3,303),(4,404),(5,505)]
df = sqlContext.createDataFrame(l,["a","b"])

wSpec = Window.orderBy(df.a).rowsBetween(-1,1)

df.select(df.a, func.rank().over(wSpec).alias("rank"))  
    ==> Failure org.apache.spark.sql.AnalysisException: Window function rank does not take a frame specification.

df.select(df.a, func.lag(df.b,1).over(wSpec).alias("prev"), df.b, func.lead(df.b,1).over(wSpec).alias("next"))  
    ===>  org.apache.spark.sql.AnalysisException: Window function lag does not take a frame specification.;


wSpec = Window.orderBy(df.a)

df.select(df.a, func.rank().over(wSpec).alias("rank"))
    ===> org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException: One or more arguments are expected.

df.select(df.a, func.lag(df.b,1).over(wSpec).alias("prev"), df.b, func.lead(df.b,1).over(wSpec).alias("next")).collect()

    [Row(a=1, prev=None, b=101, next=None), Row(a=2, prev=None, b=202, next=None), Row(a=3, prev=None, b=303, next=None)] …
Run Code Online (Sandbox Code Playgroud)

window-functions apache-spark apache-spark-sql pyspark pyspark-sql

7
推荐指数
1
解决办法
3131
查看次数

具有动态参数的Oracle Lag函数

我有一个具体的问题.我有一个包含无效值的表.我需要用0大于的前一个值替换无效值(此处)0.

困难在于,对我来说使用Update或插入是不合适的(Cursor和update会这样做).我唯一的方法是使用Select语句.

当我lag(col1, 1)在大小写时使用- 函数时,我只得到一个具有正确值的列.

select col1, col2 realcol2,  
(case 
  when col2 = 0 then 
    lag(col2,1,1) over (partition by col1 order by col1 )
  else
   col2
  end ) col2,     
col3 realcol3,
(case 
  when col3 = 0 then 
    lag(col3,1,1) over (partition by col1 order by col1 )
  else
   col3
  end ) col3
from test_table 
Run Code Online (Sandbox Code Playgroud)

内容TEST_TABLE:

---------------------------
 Col1 | Col2 | Col3 | Col4
---------------------------
  A   |  0   |  1   |  5
  B   | …
Run Code Online (Sandbox Code Playgroud)

sql oracle window-functions

7
推荐指数
3
解决办法
4168
查看次数

Spark Scala:使用分析函数获得累计和(运行总计)

我正在使用Window函数在Spark中实现累积和.但是在应用窗口分区功能时不保持记录输入的顺序

输入数据:

val base = List(List("10", "MILLER", "1300", "2017-11-03"), List("10", "Clark", "2450", "2017-12-9"), List("10", "King", "5000", "2018-01-28"),
  List("30", "James", "950", "2017-10-18"), List("30", "Martin", "1250", "2017-11-21"), List("30", "Ward", "1250", "2018-02-05"))
  .map(row => (row(0), row(1), row(2), row(3)))

val DS1 = base.toDF("dept_no", "emp_name", "sal", "date")
DS1.show()
Run Code Online (Sandbox Code Playgroud)
+-------+--------+----+----------+
|dept_no|emp_name| sal|      date|
+-------+--------+----+----------+
|     10|  MILLER|1300|2017-11-03|
|     10|   Clark|2450| 2017-12-9|
|     10|    King|5000|2018-01-28|
|     30|   James| 950|2017-10-18|
|     30|  Martin|1250|2017-11-21|
|     30|    Ward|1250|2018-02-05|
+-------+--------+----+----------+
Run Code Online (Sandbox Code Playgroud)

预期产出:

+-------+--------+----+----------+-----------+
|dept_no|emp_name| sal|      date|Dept_CumSal|
+-------+--------+----+----------+-----------+
|     10|  MILLER|1300|2017-11-03|     1300.0|
| …
Run Code Online (Sandbox Code Playgroud)

sql scala window-functions apache-spark apache-spark-sql

7
推荐指数
2
解决办法
6493
查看次数

PySpark窗口函数:orderBetween/rowsBetween之间的orderBy中的多个条件

是否有可能创建一个可以在多个条件了窗口函数排序依据rangeBetweenrowsBetween.假设我有一个如下所示的数据框.

user_id     timestamp               date        event
0040b5f0    2018-01-22 13:04:32     2018-01-22  1       
0040b5f0    2018-01-22 13:04:35     2018-01-22  0   
0040b5f0    2018-01-25 18:55:08     2018-01-25  1       
0040b5f0    2018-01-25 18:56:17     2018-01-25  1       
0040b5f0    2018-01-25 20:51:43     2018-01-25  1       
0040b5f0    2018-01-31 07:48:43     2018-01-31  1       
0040b5f0    2018-01-31 07:48:48     2018-01-31  0       
0040b5f0    2018-02-02 09:40:58     2018-02-02  1       
0040b5f0    2018-02-02 09:41:01     2018-02-02  0       
0040b5f0    2018-02-05 14:03:27     2018-02-05  1       
Run Code Online (Sandbox Code Playgroud)

每行,我需要事件列值的总和,其日期不超过3天.但我不能在同一天晚些时候发生事件.我可以创建一个窗口函数,如:

days = lambda i: i * 86400
my_window = Window\
                .partitionBy(["user_id"])\
                .orderBy(F.col("date").cast("timestamp").cast("long"))\
                .rangeBetween(-days(3), 0)
Run Code Online (Sandbox Code Playgroud)

但这将包括同一天晚些时候发生的事件.我需要创建一个窗口函数,其行为类似于(对于带*的行):

user_id …
Run Code Online (Sandbox Code Playgroud)

python window-functions apache-spark pyspark

7
推荐指数
1
解决办法
1159
查看次数

Spark SQL 中的 rank() 函数使用

使用时需要一些指示 rank()

我从数据集中提取了一列..需要进行排名。

Dataset<Row> inputCol= inputDataset.apply("Colname");    
Dataset<Row>  DSColAwithIndex=inputDSAAcolonly.withColumn("df1Rank", rank());

DSColAwithIndex.show();
Run Code Online (Sandbox Code Playgroud)

我可以对列进行排序,然后也可以附加一个索引列以获得排名......但对已知的语法和用法感到好奇 rank()

java rank window-functions apache-spark apache-spark-sql

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

在“PARTITION BY”上使用过滤条件

我有两张桌子。一种是Reference表,用来排序优先级,一种是Customer表格。该Reference表用于为表中的每一列赋予优先级Customer,为单个客户的各个列提供不同的顺序。

参考表

---------------------------------------
| Priority |   Attribute |  sourceID  |
---------------------------------------
|   1      |     EMAIL   |      1     |
|   2      |     EMAIL   |      2     |
|   3      |     EMAIL   |      3     |
|   2      |     NAME    |      1     |
|   1      |     NAME    |      2     |
|   3      |     NAME    |      3     |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

客户表

-----------------------------------------------------------------------
| CustomerID |  Name   |       Email        |  SourceID |     Date    |
-----------------------------------------------------------------------
|    1 …
Run Code Online (Sandbox Code Playgroud)

sql netezza window-functions

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