Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 以红移方式从表中获取缺少的日期_Sql_Database_Postgresql_Amazon Redshift - Fatal编程技术网

Sql 以红移方式从表中获取缺少的日期

Sql 以红移方式从表中获取缺少的日期,sql,database,postgresql,amazon-redshift,Sql,Database,Postgresql,Amazon Redshift,我有一个红移的表,它有一个日期列和一些其他数据: +------------+-------+ | Date | Value | +------------+-------+ | 2016-09-25 | 1 | | 2016-09-28 | 2 | | 2016-09-29 | 3 | +------------+-------+ 我想从这张表中找出缺失的日期。因此,从上面的示例中,如果我想获取从7天前到现在的所有缺失日期,我想生成一个返回: 2016-0

我有一个红移的表,它有一个日期列和一些其他数据:

+------------+-------+
|    Date    | Value |
+------------+-------+
| 2016-09-25 |     1 |
| 2016-09-28 |     2 |
| 2016-09-29 |     3 |
+------------+-------+
我想从这张表中找出缺失的日期。因此,从上面的示例中,如果我想获取从7天前到现在的所有缺失日期,我想生成一个返回:

2016-09-22
2016-09-23
2016-09-24
2016-09-26
2016-09-27
我试着使用generate_系列。。函数生成所有日期,然后根据表中已存在的内容筛选出这些日期。比如说:

    select CURRENT_DATE + i as MyDate
from generate_series(date '2016-09-22'- CURRENT_DATE, date '2016-09-29' - CURRENT_DATE ) i 
where MyDate not in (select [Date] from MyTable)
在这种情况下,我有一个错误MyDate不存在。我还尝试使用and EXCEPT子句,它会产生错误:

INFO:  Function "generate_series(integer,integer)" not supported.

[Err] ERROR:  Specified types or functions (one per INFO message) not supported on Redshift tables.
我尝试过的各种其他方法都会产生这种错误,我可以运行generate_系列。。当它是独立的,但如果我尝试它与任何其他条款等,它跌倒了


这在红移中可以实现吗?

红移不完全支持generate_series,我发现您可以单独使用它,但它生成的数据无法以任何方式与任何其他红移功能组合

最好的选择是创建一个每天有一行的红移表,并在联接中使用该表,如下所示

select date from dates_table
where date not in (select date from my_table)
表中的此日期列表有可用的源,此表通常称为日期维度,并在星型架构数据仓库中使用

比如说

例如,使用excel生成日期列表,然后另存为CSV可能同样容易


使用redshift COPY命令将日期加载到红移表中。

我已经找到了一种解决方法,这涉及到另一种生成一系列数字的方法,而不使用generate_series。。。不确定它的性能如何,但这可能会有所帮助。我在下面找到链接的博客。在他们的示例中,我认为他们建议将数字转储到一个表中并使用它,但下面我只是使用一个子查询来显示:


注意:在我的原始示例中,我只需要选择p3之前的前3个值。本例将涵盖更多/更高的数字

Ah okay试图避免出现这种情况,但似乎没有太多选择。我也尝试过将日期加载到临时表中,但是,正如您所说,如果您将其与任何内容(即使是插入内容)结合起来,它也不起作用。我提供了一个可能感兴趣的答案:我需要返回180天,您的解决方案似乎不可能,对吗?
SELECT CURRENT_DATE - CAST ( days AS INT ) AS [Date]
FROM
 (SELECT 
    CAST (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3)+ p4.n * POWER(2,4)+ p5.n * POWER(2,5) AS INT) AS days
      FROM 
        (SELECT 0 as n UNION SELECT 1) p0,
        (SELECT 0 as n UNION SELECT 1) p1,
        (SELECT 0 as n UNION SELECT 1) p2,
        (SELECT 0 as n UNION SELECT 1) p3,
        (SELECT 0 as n UNION SELECT 1) p4,
        (SELECT 0 as n UNION SELECT 1) p5
WHERE (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3)+ p4.n * POWER(2,4)+ p5.n * POWER(2,5)) <= 7
)
EXCEPT
SELECT Date FROM MyTable