查询数据库并按星期几分组

时间:2019-02-23 23:02:40

标签: sql date group-by google-bigquery

我有一个包含此字段的大型数据库

date         sku    sales
2019-02-23   123    20
2019-02-24   123    33
2019-02-25   123    45
2019-02-20   456    15
2019-02-22   456    23

我想获取每周的总销售量,但棘手的是,我需要假设每个SKU的最早日期是星期一,因此该表应如下所示:

date         sku    sales
2019-02-18   123    20
2019-02-19   123    33
2019-02-20   123    45
2019-02-18   456    15
2019-02-20   456    23

预期结果应该是:

date         sku    sales
W1           123    98
W1           456    38
  • 超过7天的SKU应按GROUP BY W1和W2

现在我可以按周分组,因为sku 123的所有销售额都将在同一周下降。现在,如果SKU的销售天数超过7天,则第8天将是转化后的星期一。实际上,我想要的是增加销售量,但在此之前,假定每个SKU的最早日期是该周的第一个星期一(将日期更改为使第一个记录成为星期一所需的天数。可能的问题是记录未按相应字段排序。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT 
  CONCAT('W', CAST(DIV(DATE_DIFF(t.date, start_date, DAY) + 7, 7) AS STRING)) `date`,
  sku, 
  SUM(sales) sales
FROM `project.dataset.table` t JOIN (
  SELECT sku, MIN(t.date) AS start_date
  FROM `project.dataset.table` t
  GROUP BY sku
) s USING(sku)
GROUP BY sku, `date`

您可以使用问题中的示例数据来进行测试,如上示例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT DATE '2019-02-23' `date`, '123' sku, 20 sales UNION ALL
  SELECT '2019-02-24', '123', 33 UNION ALL
  SELECT '2019-02-25', '123', 45 UNION ALL
  SELECT '2019-02-20', '456', 15 UNION ALL
  SELECT '2019-02-22', '456', 23 
)
SELECT 
  CONCAT('W', CAST(DIV(DATE_DIFF(t.date, start_date, DAY) + 7, 7) AS STRING)) `date`,
  sku, 
  SUM(sales) sales
FROM `project.dataset.table` t JOIN (
  SELECT sku, MIN(t.date) AS start_date
  FROM `project.dataset.table` t
  GROUP BY sku
) s USING(sku)
GROUP BY sku, `date`
-- ORDER BY sku, `date`  

有结果

Row     date    sku     sales    
1       W1      123     98   
2       W1      456     38