假设我有这个表:
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).
我有以下查询来计算每分钟的所有数据.
$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) 我试图阻止必须为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)
我有数据以环形结构(或循环缓冲区)排列,也就是说它可以表示为循环的序列:...- 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
我正在尝试在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
我有一个具体的问题.我有一个包含无效值的表.我需要用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) 我正在使用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) 是否有可能创建一个可以在多个条件了窗口函数排序依据为rangeBetween或rowsBetween.假设我有一个如下所示的数据框.
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) 使用时需要一些指示 rank()
我从数据集中提取了一列..需要进行排名。
Dataset<Row> inputCol= inputDataset.apply("Colname");
Dataset<Row> DSColAwithIndex=inputDSAAcolonly.withColumn("df1Rank", rank());
DSColAwithIndex.show();
Run Code Online (Sandbox Code Playgroud)
我可以对列进行排序,然后也可以附加一个索引列以获得排名......但对已知的语法和用法感到好奇 rank()
我有两张桌子。一种是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) window-functions ×10
sql ×5
apache-spark ×4
postgresql ×3
java ×2
pyspark ×2
group-by ×1
hibernate ×1
netezza ×1
oracle ×1
pyspark-sql ×1
python ×1
rank ×1
rows ×1
scala ×1
sum ×1