在 Big Query 中使用 SQL 将值拆分为当前日期和下一个日期

Splitting a value in to current date and next date with SQL in Big Query

我想用 SQL 将一天的销售数据拆分为当天和第二天。在下面的第一个 table 中,您可以看到我拥有的数据,在第二个 table 中,您可以看到我想要的数据示例。

Table 1:现状

|  Date     |   Country   | discount_code    | sales | 
|-----------|-------------|------------------|-------|
|2020-12-03 |   US        | Instagram        | 300   | 
|2020-12-03 |   UK        | Google           | 200   | 
|2020-12-02 |   US        | Instagram        | 500   | 
|2020-12-02 |   UK        | facebook         | 600   | 

Table 2:需要的情况

|  Date     |   Country   | discount_code    | sales1 | sales2 | 
|-----------|-------------|------------------|--------|--------|
|2020-12-04 |   US        | Instagram        | 0      | 150    |
|2020-12-04 |   UK        | Google           | 0      | 100    |
|2020-12-03 |   US        | Instagram        | 150    | 250    |
|2020-12-03 |   UK        | Google           | 100    | 0      |
|2020-12-03 |   UK        | facebook         | 0      | 300    |
|2020-12-02 |   US        | Instagram        | 250    | 0      |
|2020-12-02 |   UK        | facebook         | 300    | 0      |

我尝试在以下查询中自行解决:

SELECT 
date,
country,
discount_code,
sum(sales/2) AS sales1,
LEAD(sum(sales/2), 1) OVER (ORDER BY date, country, discount_code) AS sales2,
FROM `source`
GROUP BY 1,2,3
ORDER BY date DESC

此代码仅将sales2分配给上面的行。但是,我希望 sales2 特定于 datecountrydiscount_code。这将需要在这样的行尚不存在时创建它。

我希望有人对此有解决方案。这对我有很大帮助。 提前致谢!

嗯。 . .这看起来像是反透视和聚合:

select v.date, s.country, s.discount_code,
       sum(v.sales1) as sales1, sum(v.sales2) as sales2
from source s cross apply
     (values (s.date, s.sales / 2, 0),
             (dateadd(day, 1, s.date), 0, s.sales / 2)
     ) v(date, sales1, sales2)
group by v.date, s.country, s.discount_code;

如果您使用SQL服务器,您也可以使用union all和聚合来表达这一点。日期函数因数据库而异,但大致如下:

select s.date, s.country, s.discount_code,
       sum(v.sales1) as sales1, sum(v.sales2) as sales2
from ((select date, country, discount_code, sales / 2 as sales1, 0 as sales2
       from source s 
      ) union all
      (select date + interval 1 day, country, discount_code, sales / 2 as sales1, 0 as sales2
       from source s 
      ) 
     ) s
group by s.date, s.country, s.discount_code;

以下适用于 BigQuery 标准 SQL

#standardSQL
select t.date, t.country, t.discount_code,
  sum(sales1) as sales1, sum(sales2) as sales2
from `project.dataset.source`, 
unnest([struct
  (date, country, discount_code, sales/2 as sales1, 0 as sales2),
  (date + 1, country, discount_code, 0, sales/2)
]) t
group by date, country, discount_code
  

如果应用于您问题中的示例数据 - 输出为