【问题标题】:How to make multiple conditions that may overlap in CASE statement and using GROUP BY如何在 CASE 语句中创建多个可能重叠的条件并使用 GROUP BY
【发布时间】:2020-08-29 22:56:26
【问题描述】:

我在 BigQuery 中有一个查询:

WITH
  date_params AS(
  SELECT
    DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL -7 day), WEEK(MONDAY)) AS WeekStartDate,
    DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL -1 day), WEEK(SUNDAY)) AS WeekEndDate,
    date "2020-01-01" AS ReportStartDate,
    ),
  finances AS (
  SELECT
    Amount,
    CASE
      WHEN DATE (t1.Created ) BETWEEN WeekStartDate AND WeekEndDate THEN "Weelky"
      WHEN DATE (t1.Created ) BETWEEN ReportStartDate
    AND WeekEndDate THEN "Cumulative"
  END
    AS ReportPeriod
  FROM
    Table_1 t1,
    date_params p )
SELECT
  SUM(Amount) AS `Amount`
FROM
  finances
GROUP BY
  ReportPeriod

您能否解释一下如何在两个时间段之间对结果金额进行分组:1)上周和 2)从某个日期(ReportStartDate)开始,就像我尝试做的那样。唯一的问题是“累积”的 CASE 语句包括“Weelky”中的日期,但我需要从 ReportStartDate 到上周日,包括上周。

【问题讨论】:

  • 请正确格式化您的代码!

标签: sql group-by google-bigquery case-when


【解决方案1】:

CASE 只会为每一行返回一个值,这就是Weelky 中包含的行不包含在Cumulative 中的原因。有多种方法可以使单个行在两个报告中都可用。我认为可以更好地保留现有查询结构的方法如下,它构造了一个 array 以便能够用多个报告标记单行,然后是 unnests 数组。我希望这对你有用!

WITH
  date_params AS(
  SELECT
    DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL -7 day), WEEK(MONDAY)) AS WeekStartDate,
    DATE_TRUNC(DATE_ADD(CURRENT_DATE(), INTERVAL -1 day), WEEK(SUNDAY)) AS WeekEndDate,
    date "2020-01-01" AS ReportStartDate,
    ),
  finances AS (
  SELECT
    Amount,
    ARRAY_CONCAT(
      IF (DATE (t1.Created) BETWEEN WeekStartDate AND WeekEndDate,["Weelky"],[]),
      IF (DATE (t1.Created) BETWEEN ReportStartDate AND WeekEndDate,["Cumulative"],[])
    ) as ReportPeriod
  FROM
    Table_1 t1,
    date_params p )
SELECT
  SUM(Amount) AS `Amount`
FROM
  finances
  CROSS JOIN unnest(ReportPeriod) as ReportPeriod
GROUP BY
  ReportPeriod

【讨论】:

  • 谢谢,这可以是一个选项
【解决方案2】:

您可以从 ReportStartDate 开始“累积”并在 WeekStartDate 之前结束。

CASE 
    WHEN DATE (t1.Created ) BETWEEN WeekStartDate
           AND WeekEndDate then "Weelky"
    WHEN DATE (t1.Created ) BETWEEN ReportStartDate
           AND WeekStartDate-1 then "Cumulative"
    END 
    AS ReportPeriod

【讨论】:

  • 我希望上周也包含在内
  • 如果我是正确的,那么 WeekStartDate 和 WeekEndDate 是针对当前周的。如果您给出条件“BETWEEN ReportStartDate AND WeekStartDate-1”,那么您将获得从指定日期到本周开始的数据。这也包括上周。如果不是,请告诉我你说的上周是什么意思?
  • 好的,很抱歉解释混乱。假设我想从 ReportStartDate 到今天。如果我输入DATE (t1.Created ) BETWEEN ReportStartDate AND CURRENT_TIMESTAMP() Then "Cumulative" 应该可以吗?我认为它排除了以前“每周”条件中的数据
  • 不,我希望“每周”包含在累积中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 2020-10-26
相关资源
最近更新 更多