编写一个提取两个不同日期点的查询

时间:2018-02-01 21:59:43

标签: sql amazon-redshift

我正在处理涉及以下字段的查询:

id
date
revenue

还涉及其他内容,但就此而言,这些是您需要知道的唯一三个。

所以基本上,这些字段的标准语句如下:

SELCT 
id, 
date_trunc('month', date) AS month, 
SUM(revenue) AS total_rev
FROM
sample.table

假设我有一个日期,其中发生的更改影响了选择ID的性能,我想创建两个存储桶:更改前一个月的收入和进行更改的月份中的收入。

但这是另一个警告。此更改应用于某些ID的日期各不相同。对于一些人来说可能是2017年6月,而另一个人则是2017年11月。所以这给我带来了一些麻烦。但有用的是,我已经知道了这个附属的一小部分ID。所以我可以输入像

这样的WHERE语句
WHERE id IN ('12345', '67891', '11121')

我在BigQuery方面有很多经验但在Redshift方面经验不多,所以我可以使用一些帮助!

1 个答案:

答案 0 :(得分:0)

你可以:

  • 创建一个存储ID和更改日期的表
  • 按ID和与更改日期相关的相同/上个月将其加入收入数据集
  • 根据是否是同月或上个月进行有条件汇总

像这样:

create table change_log (id integer, date date);
insert into change_log values (1,'2017-11-01'),(2,'2017-12-01');

select 
id,
sum(case when date_trunc('month',r.date)=date_trunc('month',c.date) then revenue end) as revenue_change_month,
sum(case when date_trunc('month',r.date)<date_trunc('month',c.date) then revenue end) as revenue_prior_month
from revenue_table r
join change_log c
on r.id=c.id
and date_trunc('month',r.date) between dateadd(month,-1,date_trunc('month',c.date)) and date_trunc('month',c.date)
group by 1

这样,如果我理解正确的问题,那么它在日历中的实际月份并不重要,但它是每个用户的变化月和前一个月

有一点需要注意的是,如果在月末进行更改,则会对月份的月度数字产生一些影响。您可以将此更改为使用更改前30天和更改后30天,这可能会更好,具体取决于您的业务的结算模式。