Sql 如何在红移中优化此方法?

Sql 如何在红移中优化此方法?,sql,amazon-redshift,Sql,Amazon Redshift,我试图将每日谷物的数据按每月和每周进行分组。然后,我尝试找出每个星期的最后6周和6个月的合计值 注意:就我而言,数据非常庞大,大约有3000万。 因此,我现在采用的方法是创建多个临时表,例如一个用于每周级别的聚合数据,另一个用于每月聚合数据,等等。这是我的完整方法。有人能提出一种方法来优化它吗 更新:添加了输入和预期输出 输入: 预期输出: 我看到了许多我可以给你的小优化技巧。我不确定我是否有时间将它们全部组合到一个示例中 与语句一起使用-所谓的,而不是临时表。临时表的速度可能会更快,但红移

我试图将每日谷物的数据按每月和每周进行分组。然后,我尝试找出每个星期的最后6周和6个月的合计值

注意:就我而言,数据非常庞大,大约有3000万。

因此,我现在采用的方法是创建多个临时表,例如一个用于每周级别的聚合数据,另一个用于每月聚合数据,等等。这是我的完整方法。有人能提出一种方法来优化它吗

更新:添加了输入和预期输出

输入:

预期输出:


我看到了许多我可以给你的小优化技巧。我不确定我是否有时间将它们全部组合到一个示例中

  • 与语句一起使用-所谓的
    ,而不是临时表。临时表的速度可能会更快,但红移应该足够快,可以处理聚合(在10或100百万行的情况下)

    您将有一个查询,并将每个临时表步骤声明为一个表变量:

  • 用于生成不同粒度的日期:

    SELECT DATE_TRUNC('month', '2019-08-14'::DATE);  -- will return 2019-08-01 
    SELECT DATE_TRUNC('week', '2019-08-14'::DATE);  -- will return 2019-08-12 
    
  • 用于获取日历周:

    select to_char('2019-08-14'::DATE, 'WW');  -- returns 33
    
  • 使用
    SUM(日期条件为value END时为CASE)
    可能更容易获得一段时间的总和,但这取决于您如何构造转换


  • 样本数据和预期结果将有所帮助。我不知道你想实现什么。只是一个提示-在红移中你可以使用
    '2019-08-14'
    作为
    日期
    -它将被隐式铸造。或者直接转换为
    '2019-08-14'::DATE
    @gordon我会用输入和输出细节更新问题,您可以建议其他方式,而不是编写这么多代码
    SELECT DATE_TRUNC('month', '2019-08-14'::DATE);  -- will return 2019-08-01 
    SELECT DATE_TRUNC('week', '2019-08-14'::DATE);  -- will return 2019-08-12 
    
    select to_char('2019-08-14'::DATE, 'WW');  -- returns 33