SQL заставляет подзапрос работать для каждого независимого идентификатора вместо того, чтобы брать значения из нескольких идентификаторов - PullRequest
0 голосов
/ 29 января 2019

Это для нахождения 10 лучших приложений рекламодателя (в зависимости от количества установок). eCPM (расчет приведен ниже в запросе).Он работает точно, если я запускаю его только с одним идентификатором издателя.

Проблема: при использовании более одного идентификатора приложения публикации, подзапрос (C2) считывает его так, как если бы 10 лучших приложений рекламодателя были получены из нескольких идентификаторов публикации, что вводит в заблуждение вычисления. Как я могу выполнить это так, чтобы оно могло читать каждое приложение издателя (& ПОЛУЧИТЬ ECPM ТОП 10 РЕКЛАМОДАТЕЛЕЙ В ПРИЛОЖЕНИИ ИЗДАТЕЛЯ)?

 SELECT

    d.app_name AS publisher_app_name,           

    a.publisher_app AS publisher_app_id,            

    (   SELECT 
            CASE WHEN SUM(b.impressions) > 0
                THEN ROUND((1000*SUM(b.money_spent))/SUM(b.impressions),3)
                    ELSE 0
                        END AS top_10_adv_ecpm
        FROM warehouse.daily_uber_aggr b
        WHERE publisher_app IN ('983234fb17ba470008','2b3ed6ff4d0e48463')
        AND b.dt BETWEEN '2018-12-26' AND '2019-01-25'
        AND b.advertiser_app IN (   SELECT advertiser_app
                                  FROM warehouse.daily_uber_aggr
                                  WHERE publisher_app IN ('983234fb17ba470008','2b3ed6ff4d0e48463')
                                  AND dt BETWEEN '2018-12-26' AND '2019-01-25'
                                  GROUP BY advertiser_app
                                  ORDER BY SUM (converted_installs) DESC
                                  LIMIT 10
    ) AS top_10_adv_ecpm,

    SUM(a.converted_installs) AS installs_publisher

 FROM warehouse.daily_uber_aggr a

LEFT JOIN dimensions.apps d ON d.app_id = a.publisher_app

WHERE a.publisher_app IN ('983234fb17ba470008','2b3ed6ff4d0e48463')

AND a.dt BETWEEN '2018-12-26' AND '2019-01-25'

 GROUP BY 
    d.app_name,
    a.publisher_app

1 Ответ

0 голосов
/ 29 января 2019

Я вполне уверен, что вы делаете это более сложным, чем нужно.Помещение вашей агрегации в суб-выборку в вашем наборе результатов действительно портит то, что вы пытаетесь сделать.Разве это не будет (не проверено с данными, подтвержденный синтаксис) работать так же хорошо?

SELECT top 10 d.app_name AS publisher_app_name, a.publisher_app AS publisher_app_id, 
    CASE WHEN SUM(a.impressions) > 0
        THEN ROUND((1000*SUM(a.money_spent))/SUM(a.impressions),3)
        ELSE 0
        END AS top_10_adv_ecpm,
    SUM(a.converted_installs) AS installs_publisher
FROM warehouse.daily_uber_aggr a 
LEFT JOIN dimensions.apps d ON d.app_id = a.publisher_app
WHERE a.publisher_app IN ('983234fb17ba470008','2b3ed6ff4d0e48463')
AND a.dt BETWEEN '2018-12-26' AND '2019-01-25'
GROUP BY d.app_name, a.publisher_app
ORDER BY SUM (converted_installs) DESC

Обратите внимание, я изменил LIMIT 10 на top 10, потому что это было помечено как SQL Server, если это другой бренд базы данных, такойпоскольку MySQL затем использует соответствующие средства, чтобы ограничить ваши первые 10 результатов.

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

...