标签: window-functions

PostgreSQL窗口函数:row_number()over(分区col顺序col2)

以下结果集是从带有一些联接和联合的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)

sql postgresql row-number window-functions

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

SQLServer count()over()with distinct

我正在研究一个项目,我们需要计算不同行的数量.方案的简化版本包括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)

sql-server join inner-join count window-functions

9
推荐指数
1
解决办法
483
查看次数

使用ROW_NUMBER和PARTITION BY获取第一行和最后一行

样本输入

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)

sql t-sql sql-server row-number window-functions

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

优化Vertica SQL查询以执行运行总计

我有一个带有时间序列数据的表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倍.

sql running-total vertica window-functions

8
推荐指数
1
解决办法
4731
查看次数

Last_value窗口功能无法正常工作

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

oracle window-functions

8
推荐指数
2
解决办法
5462
查看次数

使用AWS Redshift中的Group By计算中位数

我已经看过其他关于在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)

group-by window-functions amazon-redshift

8
推荐指数
2
解决办法
4000
查看次数

我可以在Redshift的窗口函数中添加条件吗?

我在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)

sql window-functions amazon-redshift

8
推荐指数
1
解决办法
2849
查看次数

如何使用Spark在组中滚动时间窗口

我有一些数据要按特定列分组,然后根据组中的滚动时间窗口聚合一系列字段.

以下是一些示例数据:

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部分.

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

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

选择满足hive条件的上一行

我有这样的产品数据

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)

hive lag moving-average window-functions

8
推荐指数
1
解决办法
120
查看次数

SQL 查找具有下一个最佳时间戳匹配的行对

我的挑战是找到按时间戳相邻的行对,并仅保留值字段距离最小的那些对(差异的正值)

一个表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(蓝线)和传感器 …

sql postgresql datetime window-functions

8
推荐指数
1
解决办法
174
查看次数