0

这是为了查找前 10 名广告商应用程序(基于安装次数)的平均值。eCPM(计算如下查询)。如果我只使用一个发布者 ID 运行它,它就可以正常工作。

问题:当使用多个发布应用 ID 时,子查询 (C2) 将其读取为前 10 位广告商应用来自多个发布 ID,从而误导计算。如何以可以读取每个发布者应用程序的方式运行它(并获得每个发布者应用程序的前 10 名广告商的 ECPM)?

 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
4

1 回答 1

0

我相当肯定你让这比它需要的更复杂。将您的聚合放入结果集中的子选择中确实会弄乱您想要做的事情。这(未经数据测试,已确认语法)是否也可以正常工作?

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 10top 10因为这被标记为 SQL Server,如果它是另一个数据库品牌,例如 MySQL,那么使用适当的方法来限制你的前 10 个结果。

FWIW 原始查询的问题是您的查询和结果集中的子查询之间没有链接,因此对于您的主查询返回的每一行,您都将运行子查询并返回其完整结果。

于 2019-01-28T23:38:24.730 回答