关于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来向您展示我尝试过的内容。
答案 0 :(得分:0)
我的要求略有变化,但我能够创建一个完成新要求的功能。我的新要求只是计算所有不同的item_id
和user_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
部分,然后我就分组了这一点。