Sql 红移:使用generate series连接表

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

我有一个表存储项目级别 因此,如果您在物品升级日(如2019年10月5日)升级物品,请保存物品

|     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()
。它不能与数据联接。因此,最好的方法是生成一个带有日期的日历表,可以根据日期进行连接。该表还可以用诸如工作日/周末指标、月初/月末日期、日期名称等列进行补充。