Как сделать несколько условий, которые могут перекрываться в операторе CASE и с помощью GROUP BY

У меня есть запрос в 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

Не могли бы вы объяснить, как сгруппировать результат Amount между двумя периодами времени: 1) за последнюю неделю и 2) с определенной даты (ReportStartDate), как я пытался сделать. Единственная проблема возникла в том, что оператор CASE для «Cumulative» включает даты в «Weelky», но мне нужно от ReportStartDate до последнего воскресенья, включая последнюю неделю.


person Nata    schedule 13.05.2020    source источник
comment
Пожалуйста, отформатируйте код правильно!   -  person Eric    schedule 13.05.2020


Ответы (2)


CASE будет возвращать только одно значение для каждой строки, что Вот почему строки, включенные в Weelky, не включены в Cumulative. Существует несколько способов сделать одну строку доступной для обоих отчетов. Я мог бы подумать, что лучше сохраняет структуру вашего существующего запроса следующее, которое создает массив, чтобы можно было пометить одну строку несколькими отчетами, а затем удаляет массив. Я надеюсь, что это работает для вас!

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
person Daniel Duato    schedule 14.05.2020
comment
Спасибо, это как вариант - person Nata; 17.05.2020

Вы можете начать свой «Накопительный» с 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
person connecttopawan    schedule 13.05.2020
comment
Я хочу, чтобы эта последняя неделя тоже была включена - person Nata; 13.05.2020
comment
Если я прав, то WeekStartDate и WeekEndDate относятся к текущей неделе. Если вы зададите условие МЕЖДУ ReportStartDate И WeekStartDate-1, вы получите данные с указанной даты до начала этой недели. Это в том числе и на прошлой неделе. Если нет, то дайте мне знать, что вы имеете в виду под прошлой неделей? - person connecttopawan; 13.05.2020
comment
Хорошо, извините за путаное объяснение. Допустим, я хотел бы иметь от ReportStartDate до сегодняшнего дня. Если поставить DATE (t1.Created ) BETWEEN ReportStartDate AND CURRENT_TIMESTAMP() Then "Cumulative" должно работать? Я думаю, что это исключает данные из предыдущего еженедельного состояния - person Nata; 13.05.2020
comment
Нет, я хотел, чтобы еженедельно включалось в Накопительный - person Nata; 17.05.2020