Как определить фильтр в датах? - PullRequest
0 голосов
/ 17 апреля 2020

С помощью запроса я в основном хочу сравнить avg_clicks в разные периоды времени и установить фильтр в соответствии с avg_clicks.

Приведенный ниже запрос дает нам avg_clicks для каждого магазина в январе 2020 года. Но я хочу видеть avg_clicks, который выше, чем 0 в январе 2020 года.

Вопрос 1: Когда я добавляю where avg_clicks > 0 в запрос, я получаю следующую ошибку: Столбец 'avg_clicks' не может быть разрешен. Где поставить фильтр?

SELECT AVG(a.clicks) AS avg_clicks,
         a.shop_id, 
         b.shop_name
FROM 
    (SELECT SUM(clicks_on) AS clicks,
         shop_id,
         date
    FROM X
    WHERE site = ‘com’
            AND date >= CAST('2020-01-01' AS date)
            AND date <= CAST('2020-01-31' AS date)
    GROUP BY  shop_id, date) as a
    JOIN Y as b
    ON a.shop_id = b.shop_id
GROUP BY  a.shop_id, b.shop_name

Вопрос 2: Как я уже писал, я хочу сравнить два разных времени. А теперь я хочу увидеть avg_clicks, то есть 0 в феврале 2020 года.

В результате желаемый результат покажет мне список магазинов, у которых было более 0 кликов в январе, но 0 кликов в февраль.

Надеюсь, я смогу объяснить свой вопрос. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Для вашего Question 1 попробуйте использовать предложение having. Прочитайте выполнение порядок выражения SQL, который дает вам лучшее представление о том, почему вы получаете avg_clicks() ошибку.

SELECT AVG(a.clicks) AS avg_clicks,
         a.shop_id, 
         b.shop_name
FROM 
    (SELECT SUM(clicks_on) AS clicks,
         shop_id,
         date
    FROM X
    WHERE site = ‘com’
            AND date >= '2020-01-01'
            AND date <= '2020-01-31'
    GROUP BY  shop_id, date) as a
    JOIN Y as b
    ON a.shop_id = b.shop_id
GROUP BY  a.shop_id, b.shop_name
HAVING AVG(a.clicks) > 0

Для вашего Question 2 вы можете сделать что-то подобное

SELECT
    shop_id,
    b.shop_name,
    jan_avg_clicks,
    feb_avg_clicks
FROM
(
    SELECT 
        AVG(clicks) AS jan_avg_clicks,
        shop_id
    FROM 
        (
            SELECT 
                SUM(clicks_on) AS clicks,
                shop_id,
                date
            FROM X
            WHERE site = ‘com’
                AND date >= '2020-01-01'
                AND date <= '2020-01-31'
            GROUP BY 
                shop_id, 
                date
        ) as a
    GROUP BY   
        shop_id
    HAVING AVG(clicks) > 0
) jan

join

(
    SELECT 
        AVG(clicks) AS feb_avg_clicks,
        shop_id
    FROM 
        (
            SELECT 
                SUM(clicks_on) AS clicks,
                shop_id,
                date
            FROM X
            WHERE site = ‘com’
                AND date >= '2020-02-01'
                AND date < '2020-03-01'
            GROUP BY 
                shop_id, 
                date
        ) as a
    GROUP BY   
        shop_id
    HAVING AVG(clicks) = 0
) feb
on jan.shop_id = feb.shop_id

join Y as b
on jan.shop_id =  b.shop_id
0 голосов
/ 17 апреля 2020

Начните с условного агрегирования:

SELECT shop_id, 
       SUM(CASE WHEN DATE_TRUNC('month', date) = '2020-01-01' THEN clicks_on END)  / COUNT(DISTINCT date) as avg_clicks_jan,
       SUM(CASE WHEN DATE_TRUNC('month', date) = '2020-02-01' THEN clicks_on END)  / COUNT(DISTINCT date) as avg_clicks_feb
FROM X
WHERE site = 'com' AND
      date >= '2020-01-01' AND
      date < '2020-03-01'
GROUP BY shop_id;

Я не уверен, какое сравнение вы хотите сделать. Но если вы хотите фильтровать на основе агрегированных значений, используйте предложение HAVING.

...