Условно считая при группировке - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь объединить две таблицы

ad_data_grouped
adID, adDate (date), totalViews

Это данные, которые уже сгруппированы по adID и adDate. Вторая таблица:

leads
leadID, DateOfBirth, adID, state, createdAt(dateTime)

Я борюсь за то, чтобы объединить эти две таблицы, чтобы у меня был столбец, который подсчитывает количество потенциальных клиентов, когда у него один и тот же adID и где adDate = создал. Проблема Я сталкиваюсь с тем, что когда все подсчеты одинаковы для всех групп adID .... У меня есть несколько других вещей, которые я пытаюсь сделать, но он основан на аналогичном аналогичном условном подсчете.

Запрос: (Я знаю, что временная таблица, вероятно, излишня, но я пытаюсь разбить ее на мелкие кусочки, чтобы понять, что делает каждая часть)

CREATE TEMPORARY TABLE ad_stats_grouped
SELECT * FROM `ad_stats`
LIMIT 0;

INSERT INTO ad_stats_grouped(AdID, adDate, DailyViews)
SELECT
    AdID,
    adDate,
    sum(DailyViews)
FROM `ad_stats`
    GROUP BY adID, adDate;

SELECT
    ad_stats_grouped.adID,
    ad_stats_grouped.adDate,
    COUNT(case when ad_stats_grouped.adDate = Date(Leads.CreatedAt) THEN 1 ELSE 0 END)
    FROM `ad_stats_grouped` INNER JOIN `LEADS` ON
    ad_stats_grouped.adID = Leads.AdID
    GROUP BY adID, adDate;

1 Ответ

1 голос
/ 17 марта 2020

Проблема с вашим исходным запросом - логика c в COUNT(). Эта агрегатная функция учитывает все не null значения, поэтому она учитывает 0 и 1 с. Одним из решений было бы изменить COUNT() на SUM().

Но я думаю, что запрос можно еще более улучшить, если переместить условие даты на дату в on часть left join:

select
    g.adid,
    g.addate,
    count(l.adid) 
from `ad_stats_grouped` g
left join `leads` l 
    on g.adid = l.adid
    and l.createdat >= g.addate
    and l.createdat <  g.ad_stats + interval 1 day
group by g.adid, g.addate;
...