Redshift查询按10分钟窗口计算指标

时间:2016-06-25 01:43:20

标签: postgresql amazon-redshift

关于PostgreSQL代码,您可能知道Redshift is based off of PostgreSQL

  

Amazon Redshift基于PostgreSQL 8.0.2。 Amazon Redshift和PostgreSQL在设计和开发数据仓库应用程序时必须注意许多非常重要的差异。

我有一个像这样创建的表:

create table purchase (
  user_id int,
  item_id int,
  t timestamp
)
diststyle even
interleaved sortkey(user_id, item_id, t);

我想执行一个查询,告诉我10个分钟窗口中3个最活跃的用户(购买次数最多的用户),以及同一个10分钟窗口中3个购买次数最多的用户。

所以结果应该是这样的

+-item_id-|-user_id-|-window-+
| aaa     | xxx     | 0      |
+---------+---------+--------+
| bbb     | yyy     | 0      |
+---------+---------+--------+
| ccc     | zzz     | 0      |
+---------+---------+--------+
| ...     | ...     | 1      |
+---------+---------+--------+
| ...     | ...     | 1      |
+---------+---------+--------+
| ...     | ...     | 1      |
..............................
| ...     | ...     | 5      |
+---------+---------+--------+
| ...     | ...     | 5      |
+---------+---------+--------+
| ...     | ...     | 5      |
+---------+---------+--------+

其中aaa是前十分钟窗口中购买次数最多的项目,bbb是前十分钟窗口中购买次数最多的项目,依此类推,{{1} }是前十分钟窗口中购买次数最多的用户,xxx是第一个窗口中购买次数最多的用户,依此类推。有六个10分钟的窗口,因为我将在一个多小时的日期范围内这样做。

我对Redshift很陌生,所以很遗憾,我没有任何现有的SQL来向您展示我尝试过的内容。

1 个答案:

答案 0 :(得分:0)

我的要求略有变化,但我能够创建一个完成新要求的功能。我的新要求只是计算所有不同的item_iduser_id s

select count(distinct item_id) as item_id_count, count(distinct user_id) as user_id_count, substring(t, 0, 16) as window group by window order by window asc;

不确定其他人是否会使用相同的日期格式,但是我的yyyy-MM-dd hh:mm:ss是正确的,因此将分组的子字符串提前10分钟要求我只获取yyyy-MM-dd hh:m部分,然后我就分组了这一点。