聚合值取决于其他字段

时间:2016-08-05 08:42:33

标签: amazon-redshift

我有一个表格,其中包含日期时间和倍数属性,其中一些是我分组的,有些是我汇总的,查询就像上周每个客户的收入一样。 现在我想看到请求的时间段和前一个时间段之间的变化,所以我将有2列收入和previous_revenue。

现在我请求所请求期间的行加上前一期间的行,并且对于每个聚合字段,我添加一个case语句,其中返回值,如果不在我想要的期间,则添加0。

这导致尽可能多的CASE作为聚合字段,但始终使用相同的条件语句。

我想知道这个用例是否有更好的设计......

SELECT
customer,
SUM(
  CASE TIMESTAMP_CMP('2016-07-01 00:00:00', ft.date) > 0 WHEN true THEN 
    REVENUE
  ELSE 0 END
) AS revenue,
SUM(
  CASE TIMESTAMP_CMP('2016-07-01 00:00:00', ft.date) < 0 WHEN true THEN 
    REVENUE
  ELSE 0 END
) AS previous_revenue

WHERE date_hour >= '2016-06-01 00:00:00'
AND date_hour <= '2016-07-31 23:59:59'
GROUP BY customer 

(在我的实际用例中,我有很多列使它更难看)

1 个答案:

答案 0 :(得分:0)

首先,我建议重构时间戳并预先计算当前和之前的时间段以供日后使用。但是,这对于解决您的问题并非绝对必要:

CreateMap<SourceClass, DestinationClass>()
  .ForMember(m => m.Value1, o => o.ResolveUsing<Resolver>())
  .ForMember(m => m.Value2, o => o.ResolveUsing<Resolver>())
  .ForMember(m => m.Value3, o => o.ResolveUsing<Resolver>());

现在,为避免重复时间戳和create temporary table _period as select '2016-07-01 00:00:00'::timestamp as curr_period_start , '2016-07-31 23:59:59'::timestamp as curr_period_end , '2016-06-01 00:00:00'::timestamp as prev_period_start , '2016-06-30 23:59:59'::timestamp as prev_period_end ; 语句,可能的设计是先按句点分组,然后对该表自行执行CASE

FULL OUTER JOIN