我有一个表格,其中包含日期时间和倍数属性,其中一些是我分组的,有些是我汇总的,查询就像上周每个客户的收入一样。 现在我想看到请求的时间段和前一个时间段之间的变化,所以我将有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
(在我的实际用例中,我有很多列使它更难看)
答案 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