Как добавить столбец с уравнениями, сохранив текущую группировку - PullRequest
0 голосов
/ 06 мая 2020

У меня возникают некоторые проблемы, когда добавление последнего столбца приводит к тому, что мой groupin не работает должным образом (так я думаю)

У меня есть этот код:

with deliveryData AS(
SELECT NetworkID, Creative_Type, SUM(Impressions) AS Impressions, SUM(clicks) AS Clicks,
CASE WHEN Creative_Type = "Display" 
  THEN 
    CASE WHEN Impressions >= 100000000 
      THEN rate.DisplayAdsL3_CPM 
    WHEN Impressions > 50000000 AND Impressions < 100000000
      THEN rate.DisplayAdsL2_CPM
    WHEN Impressions <= 50000000 
      THEN rate.DisplayAdsL1_CPM  
      END
WHEN Creative_Type = "Tracking"
  THEN
    CASE WHEN Impressions = 0
      THEN rate.ClickTracker_CPC
    ELSE
      rate.Tracking_CPM
    END
END AS AdServeRate
FROM Dashboard.CM_2020_03
LEFT JOIN Dashboard.campaignManager_ClientRateTable as rate ON NetworkID = rate.Partner_ID
Group By 1,2,5
)
SELECT *
FROM deliveryData as data

Что дает мне очень чистый результат (всего 3 строки):

Row NetworkID   Creative_Type   Impressions Clicks  AdServeRate 
1   1234        Tracking        0           100     0.02
2   1234        Display         6775966     59151   0.15
3   1234        Tracking        520179      0       0.07

Я намерен объявить последний столбец, вычисляющий (в зависимости от Creative_Type) Imperssions или кликов * AdServeRate.

Я добавил еще один оператор CASE в приведенный выше код:

with deliveryData AS(
SELECT NetworkID, Creative_Type, SUM(Impressions) AS Impressions, SUM(clicks) AS Clicks,
CASE WHEN Creative_Type = "Display" 
  THEN 
    CASE WHEN Impressions >= 100000000 
      THEN rate.DisplayAdsL3_CPM 
    WHEN Impressions > 50000000 AND Impressions < 100000000
      THEN rate.DisplayAdsL2_CPM
    WHEN Impressions <= 50000000 
      THEN rate.DisplayAdsL1_CPM  
      END
WHEN Creative_Type = "Tracking"
  THEN
    CASE WHEN Impressions = 0
      THEN rate.ClickTracker_CPC
    ELSE
      rate.Tracking_CPM
    END
END AS AdServeRate,
CASE WHEN Creative_Type = "Display" 
  THEN 
    CASE WHEN Impressions >= 100000000 
      THEN ROUND(rate.DisplayAdsL3_CPM * Impressions/1000,2)
    WHEN Impressions > 50000000 AND Impressions < 100000000
      THEN ROUND(rate.DisplayAdsL2_CPM * Impressions/1000,2)
    WHEN Impressions <= 50000000 
      THEN ROUND(rate.DisplayAdsL1_CPM * Impressions/1000,2)  
      END
WHEN Creative_Type = "Tracking"
  THEN
    CASE WHEN Impressions = 0
      THEN ROUND(rate.ClickTracker_CPC * Clicks,2)
    ELSE
      ROUND(rate.Tracking_CPM * Impressions/1000,2)
    END
END AS AdServeFee
FROM Dashboard.CM_2020_03
LEFT JOIN Dashboard.campaignManager_ClientRateTable as rate ON NetworkID = rate.Partner_ID
Group By 1,2,5,6
)
SELECT *
FROM deliveryData as data

Однако вместо трех строк с добавленной комиссией теперь у меня есть 207 строк.

Я также пробовал использовать результат первого случая ( AdServeRate) во второй, но он сообщает мне, что не распознает AdServeRate

Любая помощь будет очень приветствоваться

1 Ответ

0 голосов
/ 09 мая 2020

Чтобы ответить на ваш вопрос, разделение logi c на разные CTE может помочь.

with deliveryData as (
  select NetworkID, Creative_Type, sum(Impressions) as Impressions, sum(clicks) as Clicks
  FROM Dashboard.CM_2020_03
  group by 1,2
),
calc_ad_serve_rate as (
  select 
    *,
    CASE WHEN Creative_Type = "Display" THEN 
            CASE WHEN Impressions >= 100000000 THEN rate.DisplayAdsL3_CPM 
                 WHEN Impressions > 50000000 THEN rate.DisplayAdsL2_CPM
                 WHEN Impressions <= 50000000 THEN rate.DisplayAdsL1_CPM  
            END
         WHEN Creative_Type = "Tracking" THEN
            CASE WHEN Impressions = 0 THEN rate.ClickTracker_CPC
            ELSE rate.Tracking_CPM
         END
    END AS AdServeRate
  from deliveryData
  LEFT JOIN Dashboard.campaignManager_ClientRateTable as rate ON NetworkID = rate.Partner_ID
),
final as (
  select 
    *,
    case when Creative_Type = 'Display' then round(AdServeRate*Impressions/1000,2)
         when Creative_Type = 'Tracking' then round(AdServeRate*Clicks,2)
         else 0
    end as AdServeFee
  from calc_ad_serve_rate
)
select * from final

Если вы открыты для нежелательных советов, я бы подумал о том, чтобы разбить ваши logi c даже больше, чтобы избежать сложных случаев.

with deliveryData as (),
     cte_cpm as (),
     cte_cpc as (),
     unioned as (select * from cte_cpm union all select * from cte_cpc)
select * from unioned

Представьте, что вы случайно взимаете с клиента плату C за кампании CPM или наоборот. Трудно читаемый, сложный оператор case делает этот тип ошибки более вероятным.

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