下面的查询返回给定月份和品牌的不同的“成员”计数(见下图)。
select to_char(transaction_date, 'YYYY-MM') as month, brand,
count(distinct UNIQUE_MEM_ID) as distinct_count
from source.table
group by to_char(transaction_date, 'YYYY-MM'), brand;数据在这个月结束后有15天的延迟收集(这意味着2016年9月的月度数据要到10月15日才能达到100% )。我只关心每月的数据。
我想提出的问题是:直到本月15日(10月),上个月的数据(9月)应该反映8月份的数据。当前的部分月份(10月)应该默认为前一个月,因此也是上述逻辑的默认值。
在本月15日之后,上个月的数据(9月)现在是100%,因此9月应该反映9月(10月将反映9月至11月15日,等等)。
当前的部分月份总是=前一个月。查询的复杂性在于如何计算前一个月。
此查询将在滚动的基础上运行,因此需要是动态的。
为了明确起见,我正在尝试构建一个查询,在这个查询中,前一个月(到本月底+ 15天)的distinct_count应该反映(当前月份-2个月)的值(针对每个品牌)。当月结束后15天后,前一个月=(当前月份- 1)。
部分当月默认为前一个月的数据。15天的数值应该是可变的/可修改的。

发布于 2016-10-31 17:54:34
首先,将查询简化为:
select to_char(transaction_date, 'YYYY-MM') as month, brand,
count(distinct members) as distinct_count
from source.table
group by members, to_char(transaction_date, 'YYYY-MM'), brand;那么,你就会有麻烦了。问题是,一排(比如从8月20日起)需要分成两组。一个简单的group by无法处理这个问题。那么,让我们使用union all。我认为结果是这样的:
select date_trunc('month', transaction_date) as month, brand,
count(distinct members) as distinct_count
from source.table
where (date_trunc('month', transaction_date) < date_trunc('month' current_date) - interval '1 month') or
(day(current_date) > 15 and date_trunc('month', transaction_date) = date_trunc('month' current_date) - interval '1 month')
group by date_trunc('month', transaction_date), brand
union all
select date_trunc('month' current_date) - interval '1 month' as month, brand,
count(distinct members) as distinct_count
from source.table
where (day(current_date) < 15 and date_trunc('month', transaction_date) = date_trunc('month' current_date) - interval '1 month')
group by brand;发布于 2016-10-31 17:51:38
因为您已经有了一个有效的查询,所以我将重点放在子选择上。这里可以使用的条件是CASE,特别是“搜索案例”。
case
when extract(day from current_date) < 15 then
extract(month from current_date - interval '2 months')
else
extract(month from current_date - interval '1 month')
end case例如,这可以用作where子句的一部分。
发布于 2016-10-31 18:03:55
下面是一些sudo代码,用于获取间隔的开始日期和结束日期。
开始日期:
date DATE_TRUNC('month', CURRENT_DATE - integer 15) - interval '1 month'
这将返回当前一个月后,只有在第15天,从那里你可以减去一个完整的月,以得到你的起点。
结束日期:要计算此值,请获取开始日期,加上一个月,减去一天。
https://stackoverflow.com/questions/40347191
复制相似问题