以下结果集是从带有一些联接和联合的sql查询派生的.sql查询已经在日期和游戏上对行进行分组.我需要一个列来描述按日期列分区的游戏尝试次数.
Username Game ID Date
johndoe1 Game_1 100 7/22/14 1:52 AM
johndoe1 Game_1 100 7/22/14 1:52 AM
johndoe1 Game_1 100 7/22/14 1:52 AM
johndoe1 Game_1 100 7/22/14 1:52 AM
johndoe1 Game_1 121 7/22/14 1:56 AM
johndoe1 Game_1 121 7/22/14 1:56 AM
johndoe1 Game_1 121 7/22/14 1:56 AM
johndoe1 Game_1 121 7/22/14 1:56 AM
johndoe1 Game_1 121 7/22/14 1:56 AM
johndoe1 Game_1 130 7/22/14 1:59 AM
johndoe1 Game_1 130 7/22/14 1:59 AM
johndoe1 Game_1 130 7/22/14 1:59 AM
johndoe1 Game_1 130 …Run Code Online (Sandbox Code Playgroud) 我正在研究一个项目,我们需要计算不同行的数量.方案的简化版本包括user表,keyword表和keyword_user表.
该user表仅包括公共用户元数据,如名称等.下面列出了其他表.
keyword_user:
id
user_id
keyword_id
Run Code Online (Sandbox Code Playgroud)
关键词:
id,
description
Run Code Online (Sandbox Code Playgroud)
我想要做的是根据用户keyword_id找到最大用户数(5),同时还计算匹配行的总数.计数必须是不同的.
查询:
SELECT TOP 5 u.[id],
u.[firstname],
u.[lastname],
total = Count(*) OVER()
FROM [user] u
INNER JOIN [keyword_user] ku
ON u.[id] = ku.[user_id]
WHERE ( ku.keyword_id IN ( '5f6501ec-0a71-4067-a21d-3c5f87a76411', 'c19b95c0-8554-4bbd-9526-db8f1c4f1edf'))
AND u.id NOT IN ( '12db3001-b3b9-4626-8a02-2519102cb53a' )
Run Code Online (Sandbox Code Playgroud)
结果集:
+--------------------------------------+-----------+----------+-------+
| id | firstname | lastname | total |
+--------------------------------------+-----------+----------+-------+
| F0527AC3-747A-45A6-9CF9-B1F6C7F548F8 | Kasper | Thomsen | 3 |
| 95988F6D-9C91-4779-B6C3-3D4B4D6AE836 | Michael | …Run Code Online (Sandbox Code Playgroud) Name | Value | Timestamp
-----|-------|-----------------
One | 1 | 2016-01-01 02:00
Two | 3 | 2016-01-01 03:00
One | 2 | 2016-01-02 02:00
Two | 4 | 2016-01-03 04:00
Run Code Online (Sandbox Code Playgroud)
Name | Value | EarliestTimestamp | LatestTimestamp
-----|-------|-------------------|-----------------
One | 2 | 2016-01-01 02:00 | 2016-01-02 02:00
Two | 4 | 2016-01-01 03:00 | 2016-01-03 04:00
Run Code Online (Sandbox Code Playgroud)
我想使用ROW_NUMBER()并PARTITION BY获得最新的Name,Value但我也想要最早和最新的Timestamp价值:
SELECT
t.Name,
t.Value,
t.????????? AS EarliestTimestamp,
t.Timestamp AS LatestTimestamp …Run Code Online (Sandbox Code Playgroud) 我有一个带有时间序列数据的表S,如下所示:
key day delta
Run Code Online (Sandbox Code Playgroud)
对于给定的密钥,它可能但不太可能缺少天数.
我想从delta值(正INT)构造一个累积列,以便将此累积数据插入另一个表中.这是我到目前为止所得到的:
SELECT key, day,
SUM(delta) OVER (PARTITION BY key ORDER BY day asc RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
delta
FROM S
Run Code Online (Sandbox Code Playgroud)
在我的SQL风格中,默认窗口子句是在UNBOUNDED PRECEDING和CURRENT ROW之间的范围,但我把它留在那里是明确的.
这个查询非常慢,比旧的破解查询慢了几个数量级,这个查询为累计计数填充了0.有关生成累积数字的其他方法的建议吗?
我确实在这里查看解决方案: 按表中的分组记录运行总计
我正在使用的RDBM是Vertica.Vertica SQL排除了那里的第一个subselect解决方案,它的查询规划器预测第二个左外连接解决方案的成本比我上面显示的分析形式高出约100倍.
Last_value窗口功能doesn't正常工作.
CREATE TABLE EXAMP2
(
CUSTOMER_ID NUMBER(38) NOT NULL,
VALID_FROM DATE NOT NULL
);
Customer_id Valid_from
-------------------------------------
9775 06.04.2013 01:34:16
9775 06.04.2013 20:34:00
9775 12.04.2013 11:07:01
--------------------------------------
select DISTINCT LAST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM ASC) rn
from examp1;
Run Code Online (Sandbox Code Playgroud)
当我使用时,LAST_VALUE我得到以下行:
06.04.2013 20:34:00
06.04.2013 01:34:16
12.04.2013 11:07:01
Run Code Online (Sandbox Code Playgroud)
当我使用时,FIRST_VALUE我得到以下行:
select DISTINCT FIRST_VALUE(VALID_FROM)
OVER (partition by customer_id ORDER BY VALID_FROM DESC) rn
from examp1;
4/12/2013 11:07:01 AM
Run Code Online (Sandbox Code Playgroud)
First_value查询提供正确的输出.我希望从这些查询中获得相同的输出.我为什么要这样2 different results?
我已经看过其他关于在Redshift中使用median()窗口函数的帖子,但是你如何将它与最后有一个group by的查询一起使用?
例如,假设表课程:
Course | Subject | Num_Students
-------------------------------
1 | Math | 4
2 | Math | 6
3 | Math | 10
4 | Science | 2
5 | Science | 10
6 | Science | 12
Run Code Online (Sandbox Code Playgroud)
我想得到每门课程的学生中位数.我如何编写一个给出以下结果的查询:
Subject | Median
-----------------------
Math | 6
Science | 10
Run Code Online (Sandbox Code Playgroud)
我试过了:
SELECT
subject, median(num_students) over ()
FROM
course
GROUP BY 1
;
Run Code Online (Sandbox Code Playgroud)
但是它列出了主题的每一次出现以及相同主题的相同中位数数字(这是假数据,因此它返回的实际值不是6,但只显示所有主题的相同):
Subject | Median
-----------------------
Math | 6
Math | 6
Math | 6
Science | …Run Code Online (Sandbox Code Playgroud) 我在Redshift中有一个基于事件的表.我希望将所有事件与系列中的FIRST事件联系起来,前提是事件发生在此事件之前的N小时内.
如果我所关注的是非常第一行,我想简单地做:
SELECT
event_time
,first_value(event_time)
OVER (ORDER BY event_time rows unbounded preceding) as first_time
FROM
my_table
Run Code Online (Sandbox Code Playgroud)
但是因为我只想把它与过去N小时的第一个事件联系起来,我想要的是:
SELECT
event_time
,first_value(event_time)
OVER (ORDER BY event_time rows between [N-hours ago] and current row) as first_time
FROM
my_table
Run Code Online (Sandbox Code Playgroud)
在我的桌子上的一点背景.它是用户操作,因此用户可以有效地跳转,执行1-100个操作,然后离开.大多数用户每天1-10次.会话很少持续一个多小时,所以我可以设置N = 1.
如果我只是设置一个PARTITION BY date_trunc('hour',event_time),我会为跨越一小时的会话创建双倍.
假设my_table看起来像
id | user_id | event_time
----------------------------------
1 | 123 | 2015-01-01 01:00:00
2 | 123 | 2015-01-01 01:15:00
3 | 123 | 2015-01-01 02:05:00
4 | 123 | 2015-01-01 13:10:00
5 | 123 | 2015-01-01 13:20:00 …Run Code Online (Sandbox Code Playgroud) 我有一些数据要按特定列分组,然后根据组中的滚动时间窗口聚合一系列字段.
以下是一些示例数据:
df = spark.createDataFrame([Row(date='2016-01-01', group_by='group1', get_avg=5, get_first=1),
Row(date='2016-01-10', group_by='group1', get_avg=5, get_first=2),
Row(date='2016-02-01', group_by='group2', get_avg=10, get_first=3),
Row(date='2016-02-28', group_by='group2', get_avg=20, get_first=3),
Row(date='2016-02-29', group_by='group2', get_avg=30, get_first=3),
Row(date='2016-04-02', group_by='group2', get_avg=8, get_first=4)])
Run Code Online (Sandbox Code Playgroud)
我想分组group_by,然后创建时间窗口,从最早的日期开始,并延长到30天没有该组的条目.在这30天结束后,下一个时间窗口将从下一行的日期开始,该日期不会落在上一个窗口中.
然后我想聚合,例如获得平均值get_avg和第一个结果get_first.
所以这个例子的输出应该是:
group_by first date of window get_avg get_first
group1 2016-01-01 5 1
group2 2016-02-01 20 3
group2 2016-04-02 8 4
Run Code Online (Sandbox Code Playgroud)
编辑:对不起我意识到我的问题没有正确指定.我实际上想要一个在30天不活动后结束的窗口.我相应地修改了示例的group2部分.
我有这样的产品数据
Product Date Sales Availbility
xyz 2017-12-31 724.5 6.0
xyz 2018-01-07 362.25 7.0
xyz 2018-01-14 281.75 7.0
xyz 2018-01-21 442.75 7.0
xyz 2018-01-28 442.75 6.0
xyz 2018-02-04 402.5 7.0
xyz 2018-02-11 201.25 3.0
xyz 2018-02-18 120.75 0.0
xyz 2018-02-25 40.25 0.0
xyz 2018-03-11 201.25 0.0
xyz 2018-03-18 483.0 5.0
xyz 2018-03-25 322.0 7.0
xyz 2018-04-01 241.5 7.0
xyz 2018-04-08 281.75 7.0
xyz 2018-04-15 523.25 7.0
xyz 2018-04-22 241.5 7.0
xyz 2018-04-29 362.25 7.0
Run Code Online (Sandbox Code Playgroud)
数据没有订购(一个小问题),我想要做的是,在可用性栏(第4栏)中我们有0,我想采取前3周(有完全可用性,即7)平均
如下所示:
xyz 2017-12-31 724.5 6.0 Null …Run Code Online (Sandbox Code Playgroud) 我的挑战是找到按时间戳相邻的行对,并仅保留值字段距离最小的那些对(差异的正值)
一个表measurement收集来自不同传感器的数据,带有时间戳和值。
id | sensor_id | timestamp | value
---+-----------+-----------+------
1 | 1 | 12:00:00 | 5
2 | 2 | 12:01:00 | 6
3 | 1 | 12:02:00 | 4
4 | 2 | 12:02:00 | 7
5 | 2 | 12:03:00 | 3
6 | 1 | 12:05:00 | 3
7 | 2 | 12:06:00 | 4
8 | 2 | 12:07:00 | 5
9 | 1 | 12:08:00 | 6
Run Code Online (Sandbox Code Playgroud)
传感器的值从其时间戳一直有效,直到其下一条记录的时间戳(相同的 sensor_id)。
下面的绿线显示传感器 1(蓝线)和传感器 …
window-functions ×10
sql ×6
postgresql ×2
row-number ×2
sql-server ×2
apache-spark ×1
count ×1
datetime ×1
group-by ×1
hive ×1
inner-join ×1
join ×1
lag ×1
oracle ×1
pyspark ×1
t-sql ×1
vertica ×1