在 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
特定于 date
、country
和 discount_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
如果应用于您问题中的示例数据 - 输出为
我想用 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
特定于 date
、country
和 discount_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
如果应用于您问题中的示例数据 - 输出为