--{login} - {issue}
USE hahn;

$Task_name = "{issue}";
$Query_ID = "{id}";

$Client = "{client}"; --фильтр по клиенту
$MG = "{category}"; --фильтр по медиагруппе
$Start_month = "{first_date}"; --в формате "201801"
$End_month = "{last_date}"; --в формате "201803"
$Limit = {comp_num}; --количество конкурентов для сравнения
$Region = ListUniq(AsList({region}));  -- возможные значения: "Москва и Московская область", "Санкт-Петербург и Ленинградская область", "Свердловская область", "Остальные регионы"
$Only_ya_search = "{only_search}"; --возможные значения: да - учитывать только поиск Яндекса; нет - учитывать поиск Яндекса и поисковых партнеров
$Currency = "{q_currency}"; --возможные значения: "rub" - рубли; "ye" - фишки
$NDS = {vat};
$CompetitorsFromForm = @@
{competitors}
@@;

$CompetitorsSome = String::SplitToList($CompetitorsFromForm, '\n\r', false, true);

$CompetitorsAll = (
SELECT AGGREGATE_LIST(Brand) AS Competitors FROM hahn.`home/vipplanners/users/vbatraev/BTZ/Checked/Last_period_Brands`
);

$Competitors = IF(ListLength($CompetitorsSome) = 0, $CompetitorsAll, $CompetitorsSome);

$Source = (
SELECT
Brand, Clicks, DeviceType, MediaGroup, Month, QueryBrandType, Region, Shows, TargetType, IF($NDS, Cost, IF(Month < 201901, Cost / 1.18, Cost / 1.2)) AS Cost
FROM `home/vipplanners/users/vbatraev/BTZ/Checked/Last_period`
);

$Filer_total = (
SELECT --отбираю ТОП-5 по суммарным откруткам
  Brand
, QueryBrandType
, SUM(Cost) AS SUM_Cost
FROM $Source
WHERE
  Month <= CAST($End_month AS Uint64)
  AND Month >= CAST($Start_month AS Uint64)
  AND MediaGroup = $MG
  AND Brand != $Client
  AND Brand ?? '' IN $Competitors
  AND Cost IS NOT NULL
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, Region))
  AND IF($Only_ya_search = "да", TargetType, 0) = 0
GROUP BY
  Brand
, IF(QueryBrandType = "Костыль", NULL, "Суммарно") AS QueryBrandType
ORDER BY SUM_Cost DESC
LIMIT $Limit
);

$Filter_brand = (
SELECT --отбираю ТОП-5 по брендовым кликам
  Brand
, QueryBrandType
, SUM(Cost) AS SUM_Cost
FROM $Source
WHERE
  Month <= CAST($End_month AS Uint64)
  AND Month >= CAST($Start_month AS Uint64)
  AND MediaGroup = $MG
  AND Brand != $Client
  AND Brand ?? '' IN $Competitors
  AND Cost IS NOT NULL
  AND QueryBrandType = "Брендовые"
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, Region))
  AND IF($Only_ya_search = "да", TargetType, 0) = 0
GROUP BY
  Brand
, QueryBrandType
ORDER BY SUM_Cost DESC
LIMIT $Limit
);

$Filer_comp = (
SELECT --отбираю ТОП-5 по конкурентным кликам
  Brand
, QueryBrandType
, SUM(Cost) AS SUM_Cost
FROM $Source
WHERE
  Month <= CAST($End_month AS Uint64)
  AND Month >= CAST($Start_month AS Uint64)
  AND MediaGroup = $MG
  AND Brand != $Client
  AND Brand ?? '' IN $Competitors
  AND Cost IS NOT NULL
  AND QueryBrandType = "Конкурентные"
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, Region))
  AND IF($Only_ya_search = "да", TargetType, 0) = 0
GROUP BY
  Brand
, QueryBrandType
ORDER BY SUM_Cost DESC
LIMIT $Limit
);

$Filer_general = (
SELECT --отбираю ТОП-5 по общим кликам
  Brand
, QueryBrandType
, SUM(Cost) AS SUM_Cost
FROM $Source
WHERE
  Month <= CAST($End_month AS Uint64)
  AND Month >= CAST($Start_month AS Uint64)
  AND MediaGroup = $MG
  AND Brand != $Client
  AND Brand ?? '' IN $Competitors
  AND Cost IS NOT NULL
  AND QueryBrandType = "Общие"
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, Region))
  AND IF($Only_ya_search = "да", TargetType, 0) = 0
GROUP BY
  Brand
, QueryBrandType
ORDER BY SUM_Cost DESC
LIMIT $Limit
);

$Filer = ( --отбор 4-х топов по конкурентам
SELECT *
FROM $Filer_total

UNION ALL

SELECT *
FROM $Filter_brand

UNION ALL

SELECT *
FROM $Filer_comp

UNION ALL

SELECT *
FROM $Filer_general
);

$NoNameList = ($BrandsList) -> {{ RETURN ListMap(ListFromRange(0, ListLength($BrandsList)), ($x) -> {{ RETURN "Конкурент "||CAST($x+1 AS String); }})}};

$NoNames = (
SELECT
  pairs.0 AS Brand
 ,pairs.1 AS NoNameBrand
FROM
    (
    SELECT
      ListZip(COALESCE(Brands, AsList("")), $NoNameList(Brands)) AS pairs
    FROM
        (
        SELECT AGGREGATE_LIST(Brand) AS Brands
        FROM
            (
            SELECT
              Brand
            , MAX(SUM_Cost) AS SUM_Cost
            FROM
                (
                SELECT
                  Brand
                , QueryBrandType
                , SUM(SUM_Cost) AS SUM_Cost
                FROM $Filer
                GROUP BY
                  Brand
                , IF(QueryBrandType = "Суммарно", QueryBrandType, "Сумма по типам") AS QueryBrandType
                )
            GROUP BY Brand
            ORDER BY SUM_Cost DESC
            LIMIT $Limit * 4
            )
        )
    )
FLATTEN BY pairs
);

$Data_by_month = (
SELECT --Достаю данные по клиенту в разбивке на типы запросов
  ClientType
, Brand
, QueryBrandType
, Month
, MediaGroup
, SUM_IF(Shows, DeviceType = "ПК") AS PCShows
, SUM_IF(Clicks, DeviceType = "ПК") AS PCClicks
, SUM_IF(Cost, DeviceType = "ПК") * IF($Currency = "rub", 30, 1) AS PCCost
, SUM_IF(Shows, DeviceType = "Мобильные") AS MobShows
, SUM_IF(Clicks, DeviceType = "Мобильные") AS MobClicks
, SUM_IF(Cost, DeviceType = "Мобильные") * IF($Currency = "rub", 30, 1) AS MobCost
, SUM(Shows) AS SUM_Shows
, SUM(Clicks) AS SUM_Clicks
, SUM(Cost) * IF($Currency = "rub", 30, 1) AS SUM_Cost
FROM $Source
WHERE
  Month <= CAST($End_month AS Uint64)
  AND Month >= CAST($Start_month AS Uint64)
  AND MediaGroup = $MG
  AND Brand = $Client
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, Region))
  AND IF($Only_ya_search = "да", TargetType, 0) = 0
GROUP BY
  IF(Brand = $Client, "Клиент", "Конкурент") AS ClientType
, Brand
, QueryBrandType
, Month
, MediaGroup

UNION ALL

SELECT --Достаю суммарные данные по клиенту
  ClientType
, Brand
, QueryBrandType
, Month
, MediaGroup
, SUM_IF(Shows, DeviceType = "ПК") AS PCShows
, SUM_IF(Clicks, DeviceType = "ПК") AS PCClicks
, SUM_IF(Cost, DeviceType = "ПК") * IF($Currency = "rub", 30, 1) AS PCCost
, SUM_IF(Shows, DeviceType = "Мобильные") AS MobShows
, SUM_IF(Clicks, DeviceType = "Мобильные") AS MobClicks
, SUM_IF(Cost, DeviceType = "Мобильные") * IF($Currency = "rub", 30, 1) AS MobCost
, SUM(Shows) AS SUM_Shows
, SUM(Clicks) AS SUM_Clicks
, SUM(Cost) * IF($Currency = "rub", 30, 1)  AS SUM_Cost
FROM $Source
WHERE
  Month <= CAST($End_month AS Uint64)
  AND Month >= CAST($Start_month AS Uint64)
  AND MediaGroup = $MG
  AND Brand = $Client
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, Region))
  AND IF($Only_ya_search = "да", TargetType, 0) = 0
GROUP BY
  IF(Brand = $Client, "Клиент", "Конкурент") AS ClientType
, Brand
, IF(QueryBrandType = "Костыль", NULL, "Суммарно") AS QueryBrandType
, Month
, MediaGroup

UNION ALL

SELECT --достаю ТОП-5 по суммарным кликам
  ClientType
, Brand
, QueryBrandType
, Month
, MediaGroup
, SUM_IF(s.Shows, s.DeviceType = "ПК") AS PCShows
, SUM_IF(s.Clicks, s.DeviceType = "ПК") AS PCClicks
, SUM_IF(s.Cost, s.DeviceType = "ПК") * IF($Currency = "rub", 30, 1) AS PCCost
, SUM_IF(s.Shows, s.DeviceType = "Мобильные") AS MobShows
, SUM_IF(s.Clicks, s.DeviceType = "Мобильные") AS MobClicks
, SUM_IF(s.Cost, s.DeviceType = "Мобильные") * IF($Currency = "rub", 30, 1) AS MobCost
, SUM(s.Shows) AS SUM_Shows
, SUM(s.Clicks) AS SUM_Clicks
, SUM(s.Cost) * IF($Currency = "rub", 30, 1) AS SUM_Cost
FROM $Source AS s
JOIN $Filer AS f
ON s.Brand == f.Brand
WHERE
  s.Month <= CAST($End_month AS Uint64)
  AND s.Month >= CAST($Start_month AS Uint64)
  AND s.MediaGroup = $MG
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, s.Region))
  AND IF($Only_ya_search = "да", s.TargetType, 0) = 0
  AND f.QueryBrandType = "Суммарно"
GROUP BY
  IF(s.Brand = $Client, "Клиент", "ТОП по суммарным откруткам") AS ClientType
, s.Brand AS Brand
, IF(s.QueryBrandType = "Костыль", NULL, "Суммарно") AS QueryBrandType
, s.Month AS Month
, s.MediaGroup AS MediaGroup

UNION ALL

SELECT --достаю ТОП-5 по суммарным кликам в разбивке на типы для построения бубликов
  ClientType
, Brand
, QueryBrandType
, Month
, MediaGroup
, SUM_IF(s.Shows, s.DeviceType = "ПК") AS PCShows
, SUM_IF(s.Clicks, s.DeviceType = "ПК") AS PCClicks
, SUM_IF(s.Cost, s.DeviceType = "ПК") * IF($Currency = "rub", 30, 1) AS PCCost
, SUM_IF(s.Shows, s.DeviceType = "Мобильные") AS MobShows
, SUM_IF(s.Clicks, s.DeviceType = "Мобильные") AS MobClicks
, SUM_IF(s.Cost, s.DeviceType = "Мобильные") * IF($Currency = "rub", 30, 1) AS MobCost
, SUM(s.Shows) AS SUM_Shows
, SUM(s.Clicks) AS SUM_Clicks
, SUM(s.Cost) * IF($Currency = "rub", 30, 1) AS SUM_Cost
FROM $Source AS s
JOIN $Filer AS f
ON s.Brand == f.Brand
WHERE
  s.Month <= CAST($End_month AS Uint64)
  AND s.Month >= CAST($Start_month AS Uint64)
  AND s.MediaGroup = $MG
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, s.Region))
  AND IF($Only_ya_search = "да", s.TargetType, 0) = 0
  AND f.QueryBrandType = "Суммарно"
GROUP BY
  IF(s.Brand = $Client, "Клиент", "ТОП по суммарным откруткам") AS ClientType
, s.Brand AS Brand
, s.QueryBrandType AS QueryBrandType
, s.Month AS Month
, s.MediaGroup AS MediaGroup

UNION ALL

SELECT --достаю ТОП-5 по типам кликов
  ClientType
, Brand
, QueryBrandType
, Month
, MediaGroup
, SUM_IF(s.Shows, s.DeviceType = "ПК") AS PCShows
, SUM_IF(s.Clicks, s.DeviceType = "ПК") AS PCClicks
, SUM_IF(s.Cost, s.DeviceType = "ПК") * IF($Currency = "rub", 30, 1) AS PCCost
, SUM_IF(s.Shows, s.DeviceType = "Мобильные") AS MobShows
, SUM_IF(s.Clicks, s.DeviceType = "Мобильные") AS MobClicks
, SUM_IF(s.Cost, s.DeviceType = "Мобильные") * IF($Currency = "rub", 30, 1) AS MobCost
, SUM(s.Shows) AS SUM_Shows
, SUM(s.Clicks) AS SUM_Clicks
, SUM(s.Cost) * IF($Currency = "rub", 30, 1) AS SUM_Cost
FROM $Source AS s
JOIN $Filer AS f
ON s.Brand == f.Brand AND s.QueryBrandType = f.QueryBrandType
WHERE
  s.Month <= CAST($End_month AS Uint64)
  AND s.Month >= CAST($Start_month AS Uint64)
  AND s.MediaGroup = $MG
  AND IF(ListHas($Region, "Россия"), true, ListHas($Region, s.Region))
  AND IF($Only_ya_search = "да", s.TargetType, 0) = 0
GROUP BY
  IF(s.Brand = $Client, "Клиент", "Конкурент") AS ClientType
, s.Brand AS Brand
, s.QueryBrandType AS QueryBrandType
, s.Month AS Month
, s.MediaGroup AS MediaGroup
);

$Data_by_q = (
SELECT
  ClientType
, Brand
, QueryBrandType
, MediaGroup
, SUM(PCShows) AS PCShows
, SUM(PCClicks) AS PCClicks
, SUM(PCCost) AS PCCost
, SUM(MobShows) AS MobShows
, SUM(MobClicks) AS MobClicks
, SUM(MobCost) AS MobCost
, SUM(SUM_Shows) AS SUM_Shows
, SUM(SUM_Clicks) AS SUM_Clicks
, SUM(SUM_Cost) AS SUM_Cost
FROM $Data_by_month
GROUP BY
  ClientType
, Brand
, QueryBrandType
, MediaGroup
);

-- RES1 - полные данные по месяцам
$tmp_res1 = "tmp/robot-btz/"||$Task_name||"/"||$Query_ID||"_full_data_months";
INSERT INTO $tmp_res1 WITH TRUNCATE
SELECT
  data.ClientType AS ClientType
, nonames.NoNameBrand??data.Brand AS Brand
, data.QueryBrandType AS QueryBrandType
, data.Month AS Month
, IF(ListLength($Region) = 4, "Россия", String::JoinFromList($Region, ", ")) AS Region
, data.MediaGroup AS MediaGroup
, data.PCShows AS PCShows
, data.PCClicks AS PCClicks
, data.PCCost AS PCCost
, data.MobShows AS MobShows
, data.MobClicks AS MobClicks
, data.MobCost AS MobCost
, data.SUM_Shows AS SUM_Shows
, data.SUM_Clicks AS SUM_Clicks
, data.SUM_Cost AS SUM_Cost
FROM $Data_by_month AS data
LEFT JOIN $NoNames AS nonames
USING (Brand)
ORDER BY ClientType, QueryBrandType, Month, Brand;

-- RES2 - полные данные за квартал
$tmp_res2 = "tmp/robot-btz/"||$Task_name||"/"||$Query_ID||"_full_data_period";
INSERT INTO $tmp_res2 WITH TRUNCATE
SELECT
  data.ClientType AS ClientType
, nonames.NoNameBrand??data.Brand AS Brand
, data.QueryBrandType AS QueryBrandType
, IF(ListLength($Region) = 4, "Россия", String::JoinFromList($Region, ", ")) AS Region
, data.MediaGroup AS MediaGroup
, data.PCShows AS PCShows
, data.PCClicks AS PCClicks
, data.PCCost AS PCCost
, data.MobShows AS MobShows
, data.MobClicks AS MobClicks
, data.MobCost AS MobCost
, data.SUM_Shows AS SUM_Shows
, data.SUM_Clicks AS SUM_Clicks
, data.SUM_Cost AS SUM_Cost
FROM $Data_by_q AS data
LEFT JOIN $NoNames AS nonames
USING (Brand)
ORDER BY ClientType, QueryBrandType, Brand;

$ForRes3 = (
SELECT
  ClientType
, BrandType
, QueryBrandType
, Month
, MediaGroup
, COUNT_IF(PCShows IS NOT NULL) AS PCCompCount
, COUNT_IF(MobShows IS NOT NULL) AS MobCompCount
, COUNT_IF(SUM_Shows IS NOT NULL) AS SUM_CompCount
, AVG(PCShows)??0 AS PCShows
, AVG(PCClicks)??0 AS PCClicks
, AVG(PCCost)??0 AS PCCost
, SUM(PCClicks) * 1.0 / SUM(PCShows) AS PCCTR
, NANVL(SUM(PCCost) * 1.0 / SUM(PCClicks), null) AS PCCPC
, AVG(MobShows)??0 AS MobShows
, AVG(MobClicks)??0 AS MobClicks
, AVG(MobCost)??0 AS MobCost
, SUM(MobClicks) * 1.0 / SUM(MobShows) AS MobCTR
, NANVL(SUM(MobCost) * 1.0 / SUM(MobClicks), null) AS MobCPC
, AVG(SUM_Shows)??0 AS SUM_Shows
, AVG(SUM_Clicks)??0 AS SUM_Clicks
, AVG(SUM_Cost)??0 AS SUM_Cost
, SUM(SUM_Clicks) * 1.0 / SUM(SUM_Shows) AS SUM_CTR
, NANVL(SUM(SUM_Cost) * 1.0 / SUM(SUM_Clicks), null) AS SUM_CPC
FROM $Data_by_month
GROUP BY
  ClientType
, IF(Brand = $Client, Brand, "Среднее по конкурентам") AS BrandType
, QueryBrandType
, Month
, MediaGroup
);

-- RES3 - Бенч по месяцам
$tmp_res3 = "tmp/robot-btz/"||$Task_name||"/"||$Query_ID||"_benchmark_month";
INSERT INTO $tmp_res3 WITH TRUNCATE
SELECT
  ClientType
, BrandType
, QueryBrandType
, PCCompCount
, MobCompCount
, SUM_CompCount
, Month
, IF(ListLength($Region) = 4, "Россия", String::JoinFromList($Region, ", ")) AS Region
, MediaGroup
, PCShows
, PCClicks
, PCCost
, PCCTR
, PCCPC
, MobShows
, MobClicks
, MobCost
, MobCTR
, MobCPC
, SUM_Shows
, SUM_Clicks
, SUM_Cost
, SUM_CTR
, SUM_CPC
FROM $ForRes3
ORDER BY ClientType, QueryBrandType, Month, BrandType;

$ForRes4 = (
SELECT
  ClientType
, BrandType
, QueryBrandType
-- , Region
, MediaGroup
, COUNT_IF(PCShows IS NOT NULL) AS PCCompCount
, COUNT_IF(MobShows IS NOT NULL) AS MobCompCount
, COUNT_IF(SUM_Shows IS NOT NULL) AS SUM_CompCount
, AVG(PCShows)??0 AS PCShows
, AVG(PCClicks)??0 AS PCClicks
, AVG(PCCost)??0 AS PCCost
, SUM(PCClicks) * 1.0 / SUM(PCShows) AS PCCTR
, NANVL(SUM(PCCost) * 1.0 / SUM(PCClicks), null) AS PCCPC
, AVG(MobShows)??0 AS MobShows
, AVG(MobClicks)??0 AS MobClicks
, AVG(MobCost)??0 AS MobCost
, SUM(MobClicks) * 1.0 / SUM(MobShows) AS MobCTR
, NANVL(SUM(MobCost) * 1.0 / SUM(MobClicks), null) AS MobCPC
, AVG(SUM_Shows)??0 AS SUM_Shows
, AVG(SUM_Clicks)??0 AS SUM_Clicks
, AVG(SUM_Cost)??0 AS SUM_Cost
, SUM(SUM_Clicks) * 1.0 / SUM(SUM_Shows) AS SUM_CTR
, NANVL(SUM(SUM_Cost) * 1.0 / SUM(SUM_Clicks), null) AS SUM_CPC
FROM $Data_by_q
GROUP BY
  ClientType
, IF(Brand = $Client, Brand, "Среднее по конкурентам") AS BrandType
, QueryBrandType
, MediaGroup
);

-- RES4 - Бенч по кварталу
$tmp_res4 = "tmp/robot-btz/"||$Task_name||"/"||$Query_ID||"_benchmark_period";
INSERT INTO $tmp_res4 WITH TRUNCATE
SELECT
  ClientType
, BrandType
, QueryBrandType
, PCCompCount
, MobCompCount
, SUM_CompCount
, IF(ListLength($Region) = 4, "Россия", String::JoinFromList($Region, ", ")) AS Region
, MediaGroup
, PCShows
, PCClicks
, PCCost
, PCCTR
, PCCPC
, MobShows
, MobClicks
, MobCost
, MobCTR
, MobCPC
, SUM_Shows
, SUM_Clicks
, SUM_Cost
, SUM_CTR
, SUM_CPC
FROM $ForRes4
ORDER BY ClientType, QueryBrandType, BrandType;
