Samarendra Pulicherla Ответов: 2

Как найти топовый рекламный аккаунт для каждого рекламодателя на основе общего дохода


Доход от рекламы ad-acnt
Adv1 Ad1 200
Adv1 Ad2 50
Adv1 Ad2 300
Adv1 Ad1 250
Adv2 Ad11 200
Adv2 Ad12 250
Adv2 Ad12 300
Adv2 Ad11 300

Ну, мне нужно, чтобы результат выглядел примерно так

Adv1 Ad1 450
Adv2 Ad12 550

Я довольно новичок в SQL и хотел бы знать ваши предложения по этому поводу. Спасибо!!

Что я уже пробовал:

Я попробовал это сделать, но не смог понять, почему это не работает.
<pre lang="SQL">
select advertiser, ad_account, max(tot_rev)
from (
select advertiser, ad_account, sum(revenue) as tot_rev
from ad
group by advertiser, ad_account)
group by advertiser, ad_account
order by advertiser, ad_account

Richard Deeming

Вы отметили свой вопрос как "SQL Server", "MySQL" и "Oracle". Это три совершенно разных продукта, и ответ будет разным в зависимости от того, какой из них вы используете.

Так Какой же из них вы используете?

Samarendra Pulicherla

Я обновил его до тега SQL. Поэтому я бы предпочел его в MySQL но я постараюсь понять SQL код для других баз данных

2 Ответов

Рейтинг:
19

Richard Deeming

Предполагая, что Microsoft SQL Server, что-то вроде этого должно работать:

WITH cteTotalRevenue As
(
    SELECT
        ad.Advert,
        ad.Ad,
        SUM(ad.Revenue) As Revenue
    FROM
        ad
    GROUP BY
        ad.Advert,
        ad.Ad
),
cteRanked As
(
    SELECT
        Advert,
        Ad,
        Revenue,
        ROW_NUMBER() OVER (PARTITION BY Advert ORDER BY Revenue DESC) As RN
    FROM
        cteTotalRevenue
)
SELECT
    Advert,
    Ad,
    Revenue
FROM
    cteRanked
WHERE
    RN = 1
;


Samarendra Pulicherla

Спасибо, Ричард !!

Рейтинг:
0

OriginalGriff

Попробуйте использовать TOP 1 WITH TIES: SQL Server: TOP...WITH TIES - это красота TSQL[^]
Тогда это совсем просто:

SELECT TOP 1 WITH TIES
      advertiser, 
      ad_account, 
      tot_rev
FROM (SELECT advertiser, ad_account, SUM(revenue) AS tot_rev
      FROM ad
      GROUP BY advertiser, ad_Account) a
ORDER BY ROW_NUMBER() OVER (PARTITION BY ADVERTISER ORDER BY tot_rev DESC);


Dave Kreskowiak

Мне больше нравится ответ Ричардса, потому что он просто кричит: "кто-то сделал мою домашнюю работу за меня", когда ОП пытается превратить его в свой собственный ответ.
:)

OriginalGriff

Мой более тонкий: сколько учителей слышали о связях?

Я хочу быть там и увидеть, как он объясняет, как это работает ... :смеяться:

Samarendra Pulicherla

Ну, если возникнет ситуация, когда мне придется это объяснить, я, конечно же, пойду с ответом Ричардса. хотя принести с собой галстуки было бы как дополнительный пункт, но я еще не знаю об этом, и спасибо, что разместили ссылку на этот оригинальный гриф.

Samarendra Pulicherla

не беспокойтесь, ребята. это не домашнее задание. Это я просто практикуюсь.