Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.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
Amazon redshift 根据其他字段聚合的值_Amazon Redshift - Fatal编程技术网

Amazon redshift 根据其他字段聚合的值

Amazon redshift 根据其他字段聚合的值,amazon-redshift,Amazon Redshift,我有一个带有日期时间和倍数属性的表,其中一些是我分组的依据,另一些是我聚合的依据,查询结果类似于上周给我每个客户的收入。 现在我想看到请求的时间段和前一个时间段之间的变化,因此我将有两列revenue和previous_revenue 现在我正在请求请求的时段行加上上上一个时段的行,对于每个聚合字段,我添加了一个case语句,其中返回值或0(如果不是我想要的时段) 这将导致与聚合字段一样多的CASE,但始终使用相同的条件语句 我想知道这个用例是否有更好的设计 SELECT customer, S

我有一个带有日期时间和倍数属性的表,其中一些是我分组的依据,另一些是我聚合的依据,查询结果类似于上周给我每个客户的收入。 现在我想看到请求的时间段和前一个时间段之间的变化,因此我将有两列revenue和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 

在我的实际用例中,我有许多列,这些列使它更加难看。首先,我建议重构时间戳,并预先计算当前和以前的周期,以便以后使用。不过,这并不是解决您的问题所必须的:

创建临时表\u期间为 选择 “2016-07-01 00:00:00”:当前时段开始的时间戳 ,'2016-07-31 23:59:59'::当前时段结束时的时间戳 ,'2016-06-01 00:00:00'::时间戳作为上一个周期的开始 ,'2016-06-30 23:59:59'::上一周期结束时的时间戳 ; 现在,一种避免时间戳和CASE语句重复的可能设计是,首先按句点分组,然后对该表本身执行完整的外部联接:

以_聚合为例 选择 案例 当上一个周期开始和上一个周期结束之间的日期小时,则为“上一个” 当前时段开始和当前时段结束之间的日期小时,则为“当前” 结束::varchar20作为期间 顾客 -<要按转到此处分组的其他列> ,将收入计算为收入 -<其他聚集在这里> 从…起 _收入,(单位期间) 哪里 上一周期开始和当前周期结束之间的日期小时 分组1,2 选择 顾客 ,当期收入作为收入 ,上一期收入作为上一期收入 从…起 选择*from _aggregate,其中period='previous'previous _period 完全外部联接从_聚合中选择*,其中期间='current'当前_期间 usingcustomer-所有按分组的列必须进入using子句: -例如,使用客户、某些列、另一列 ;
首先,我建议重构时间戳,并预先计算当前和前一个周期,以便以后使用。不过,这并不是解决您的问题所必须的:

创建临时表\u期间为 选择 “2016-07-01 00:00:00”:当前时段开始的时间戳 ,'2016-07-31 23:59:59'::当前时段结束时的时间戳 ,'2016-06-01 00:00:00'::时间戳作为上一个周期的开始 ,'2016-06-30 23:59:59'::上一周期结束时的时间戳 ; 现在,一种避免时间戳和CASE语句重复的可能设计是,首先按句点分组,然后对该表本身执行完整的外部联接:

以_聚合为例 选择 案例 当上一个周期开始和上一个周期结束之间的日期小时,则为“上一个” 当前时段开始和当前时段结束之间的日期小时,则为“当前” 结束::varchar20作为期间 顾客 -<要按转到此处分组的其他列> ,将收入计算为收入 -<其他聚集在这里> 从…起 _收入,(单位期间) 哪里 上一周期开始和当前周期结束之间的日期小时 分组1,2 选择 顾客 ,当期收入作为收入 ,上一期收入作为上一期收入 从…起 选择*from _aggregate,其中period='previous'previous _period 完全外部联接从_聚合中选择*,其中期间='current'当前_期间 usingcustomer-所有按分组的列必须进入using子句: -例如,使用客户、某些列、另一列 ;