Sql BigQuery-折叠具有连续日期的行
我有一张包含销售目标的表格。它们通常每月设置一次,但每天和市场一起加载到表中。例如,如果1月份的英国目标为1550,则将加载31行(1月份每天一行),每个行的目标为50(1550/31天) 我想把它折叠起来,这样每一行都有一个Sql BigQuery-折叠具有连续日期的行,sql,google-bigquery,olap,Sql,Google Bigquery,Olap,我有一张包含销售目标的表格。它们通常每月设置一次,但每天和市场一起加载到表中。例如,如果1月份的英国目标为1550,则将加载31行(1月份每天一行),每个行的目标为50(1550/31天) 我想把它折叠起来,这样每一行都有一个dateFrom和dateTo列,以减少加载数据的工作量和查询数据的时间/成本 我通过对市场和目标进行分组,并将最大和最小日期以及目标的总和相加来实现这一点: SELECT MIN(date) AS dateFrom, MAX(date) AS dateTo,
dateFrom
和dateTo
列,以减少加载数据的工作量和查询数据的时间/成本
我通过对市场和目标进行分组,并将最大和最小日期以及目标的总和相加来实现这一点:
SELECT
MIN(date) AS dateFrom,
MAX(date) AS dateTo,
Market,
target AS dailyTarget,
SUM(target) AS target
FROM targets
GROUP BY Market, dailyTarget
ORDER BY dateFrom
我预计会有三行,但有一个问题——同一个市场和目标的月份被另一个目标的月份分割,我们会得到重叠的行。在上面的例子中,一月和三月的每日目标都是50,而二月的目标是25
我认为解决方案在于使用窗口只将日期与前一行日期相邻的行分组,但我不知道如何实现这一点
谢谢你的帮助 下面是BigQuery标准SQL
#standardSQL
SELECT
MIN(date) AS dateFrom,
MAX(date) AS dateTo,
Market,
target AS dailyTarget,
SUM(target) AS target
FROM `project.dataset.targets`
GROUP BY Market, dailyTarget, DATE_TRUNC(date, MONTH)
ORDER BY dateFrom
如您所见,您只需将
日期\u TRUNC(日期,月份)
添加到分组依据
这是一个缺口和孤岛问题。您可以使用以下方法获取范围:
select market, min(date), max(date), target
from (select t.*,
row_number() over (partition by market, target order by date) as seqnum_t,
row_number() OVER (partition by market order by date) as seqnum
from targets t
) t
group by market, target, (seqnum - seqnum_t)
你试过了吗?如果合适,请随意投票/接受
select market, min(date), max(date), target
from (select t.*,
row_number() over (partition by market, target order by date) as seqnum_t,
row_number() OVER (partition by market order by date) as seqnum
from targets t
) t
group by market, target, (seqnum - seqnum_t)