Я пытаюсь рассчитать дисперсию, используя sql между двумя одинаковыми днями двух лет - PullRequest
0 голосов
/ 28 февраля 2019

Я постараюсь быть максимально простым, чтобы сделать мой вопрос кристально ясным.У меня есть таблица, которая называется 'fb_ads' (о разных кампаниях на Facebook для разных магазинов в США) в BigQuery, она содержит следующие столбцы:

  • STORE: название магазина
  • Клики: количество кликов.
  • ВПЕЧАТЛЕНИЯ: количество показов объявления
  • СТОИМОСТЬ: стоимость объявления
  • ДАТА: AAAA-MM-DD
  • Частота: количество посетителей магазина

Итак, я пытаюсь вычислить дисперсию между двумя годами 2017 и 2018.

Вот дисперсия, которую я пытаюсь вычислить:

Variance_Of_Frequency = ((Frequency in 2018 at date X) - ((Frequency in 2017 at date X))/((Frequency in 2017 at date X)

Проблема в том, что мне придется сравнивать тот же день недели, близкий к дате X;

Например, если в понедельник я запускаю кампанию2017-08-13, мне нужно сравнить с другим понедельником в 2018 году, близким к 2018-08-13 (например, это может быть понедельник 2018-08-15).

Это ежедневныйДисперсия!

Я пытался сделать еженедельное вычисление дисперсии, и я не знаю, правильно ли это, вот как я это сделал:

Сначала я начал агрегировать свою ежедневную таблицу в недельные таблицы, используя следующий запрос:

, создав свою недельную таблицу

SELECT
  year_week,
  STORE,
  min(DATE ) as DATE ,
  SUM(IMPRESSIONS ) AS FB_IMPRESSIONS ,
  SUM(CLICKS ) AS FB_CLICKS ,
  SUM(COST) AS FB_COST ,
  SUM(Frequency) AS FREQUENCY,

FROM (
  SELECT
    *,
    CONCAT(cast(ANNEE as string), LPAD(cast((extract(WEEK from date)) as string), 2, '0') ) AS year_week
  FROM `fb_ads`)
GROUP BY
  year_week,
  STORE,

  ORDER BY year_week

Затем я попытался вычислить дисперсию, используяэто:

SELECT
  base.*, (base.frequency-lw.frequency) / lw.frequency as VAR_FF
FROM
  `weekly_table` base
JOIN (
  SELECT
    * EXCEPT (date),
    DATE_ADD(DATE(TIMESTAMP(date)) , INTERVAL 1 Week)AS date
  FROM
    `weekly_table` ) lw
ON
  base.date = lw.date
  AND base.store= lw.store

Кто-нибудь знает, как делать повседневные дела или если мои еженедельные запросы верны?

Спасибо!

1 Ответ

0 голосов
/ 28 февраля 2019

Для данной даты вы хотите знать дату ближайшего понедельника к той же дате в следующем году ...

SET @dt = '2017-08-17';
SELECT CASE WHEN WEEKDAY(@dt + INTERVAL 1 YEAR) > 3 
            THEN ADDDATE(ADDDATE(@dt + INTERVAL 1 YEAR,INTERVAL 1 WEEK),INTERVAL - WEEKDAY(@dt + INTERVAL 1 YEAR) DAY) 
            ELSE ADDDATE(@dt + INTERVAL 1 YEAR,INTERVAL - WEEKDAY(@dt + INTERVAL 1 YEAR) DAY)
            END x;

Очевидно, я мог бы удалить все эти + INTERVAL 1 YEAR битыопределение @dt таким образом для начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...