Sql 红移:使用generate series连接表
我有一个表存储项目级别 因此,如果您在物品升级日(如2019年10月5日)升级物品,请保存物品Sql 红移:使用generate series连接表,sql,amazon-redshift,Sql,Amazon Redshift,我有一个表存储项目级别 因此,如果您在物品升级日(如2019年10月5日)升级物品,请保存物品 | day | customer | items |levels| | ------- | ------- | ------- | -----| | 2019-10-02 | a | item1 | 0 | | 2019-10-05 | a | item1 | 1 | | 2019-10-09
| day | customer | items |levels|
| ------- | ------- | ------- | -----|
| 2019-10-02 | a | item1 | 0 |
| 2019-10-05 | a | item1 | 1 |
| 2019-10-09 | a | item1 | 2 |
所以我的目标是每天找出我的表中有多少不同级别的项目。因此,在上表中,我无法确定2019年10月5日至2019年10月9日之间有一个一级项目
因此,我需要计算所有级别,并在其他几天显示。(累积金额)
所以最后我找到了一些可以计算的东西
SELECT *
FROM (
SELECT date date_d,
d.cust_id,
item_id,
item_level,
last_value(item_level) IGNORE NULLS OVER (PARTITION BY d.cust_id ORDER BY date_d
ROWS UNBOUNDED PRECEDING ) level_d
FROM daily d
LEFT JOIN (
SELECT cust_id,
date date_u,
item_id
item_level,
RANK()
OVER (PARTITION BY cust_id,date_u,item_id ORDER BY TIMESTAMP DESC ) rank
FROM update
where item_id = '1'
) u ON u.cust_id= d.cust_id AND u.date_u = d.date_d AND rank = 1
GROUP BY
1, 2, 3, 4, 5)
结果是:
| date | customer | items |levels|
| ------- | ------- | ------- | -----|
| 2019-10-02 | a | item1 | 0 |
| 2019-10-03 | a | item1 | 0 |
| 2019-10-04 | a | item1 | 0 |
| 2019-10-05 | a | item1 | 1 |
| 2019-10-06 | a | item1 | 1 |
| 2019-10-07 | a | item1 | 1 |
| 2019-10-08 | a | item1 | 1 |
| 2019-10-09 | a | item1 | 2 |
| 2019-10-10 | a | item1 | 2 |
但问题是,如果客户不在第二个表中,我们无法进一步查看,因此我需要所有客户项目的当前日期
我想创建一个像这样的generate系列并加入我的表
SELECT (getdate() - (i * interval '1 day'))::date as date_datetime
FROM generate_series(1,DATEDIFF(day, '2019/10/01', getdate())) i
ORDER BY 1
但我有一个红移错误
任何想法如何将generate_系列数据连接到我的表或任何不同想法您可以使用原始表生成日期:
with dates as (
select '2010-01-01'::date + row_number() over () * interval '1 day' as dte
from daily d
limit 5000
)
. . .
然后,您可以在查询中使用它,就像在generate_series()
中一样
注意:这假设您的每日表格中有足够的行数。通常最简单、最好的解决方案是创建一个包含每个日期的表格并加入其中。Amazon Redshift仅允许在leader节点上使用
generate_series()
。它不能与数据联接。因此,最好的方法是生成一个带有日期的日历表,可以根据日期进行连接。该表还可以用诸如工作日/周末指标、月初/月末日期、日期名称等列进行补充。