SQL MAX для COUNT (с другими столбцами) - PullRequest
1 голос
/ 20 февраля 2011

У меня есть база данных с 3 отношениями Предложения, продукты и категории. Я пытаюсь найти день месяца с максимальным количеством предлагаемых продуктов. Мне нужно вернуть Название категории (CN), День с максимальным количеством предложений (OD) и количеством предложений (ПК).

У меня есть этот запрос:

SELECT CN, MAX(PC)
FROM
(
SELECT c.nombre as CN, EXTRACT(DAY FROM o.fecha) as OD, count(o.id_producto_ofertado) AS PC
FROM ofertas o join (categorias c JOIN productos p ON c.id = p.categoria) on o.id_producto_ofertado = p.id
GROUP BY  EXTRACT(DAY FROM o.fecha), c.nombre
)
GROUP BY CN

Полагаю, это работает. Но в результате получается связь с 2 столбцами: CN & MAX (PC). Если я попытаюсь привести день (OD), потому что он мне нужен, используя:

SELECT CN, MAX(PC), OD
FROM
(
SELECT c.nombre as CN, EXTRACT(DAY FROM o.fecha) as OD, count(o.id_producto_ofertado) AS PC
FROM ofertas o join (categorias c JOIN productos p ON c.id = p.categoria) on o.id_producto_ofertado = p.id
GROUP BY  EXTRACT(DAY FROM o.fecha), c.nombre
)
GROUP BY CN, OD

Затем возвращается отношение 3 столбцов: CN, MAX (PC) и OD. НО с повторением названия категории (CN), я думаю, потому что мне нужно сгруппировать по OD, чтобы извлечь также день. Итак, возврат содержит строку для каждого из 31 дня.

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

Я застрял прямо сейчас, потому что я не знаю, что делать. Спасибо

1 Ответ

2 голосов
/ 20 февраля 2011

Вы можете использовать row_number, чтобы выбрать строку с наибольшим количеством предложений:

select  CustomerName
,       OrderDate
,       OfferCount
from    (
        select  CustomerName
        ,       OrderDate
        ,       OfferCount
        ,       row_number() over (partition by CustomerName
                                   order by OfferCount desc) as rn
        from    (
                select  c.nombre as CustomerName
                ,       EXTRACT(DAY FROM o.fecha) as OrderDate
                ,       count(o.id_producto_ofertado) as OfferCount
                FROM    ofertas o 
                join    categorias c 
                on      o.id_producto_ofertado = p.id
                join    productos p 
                on      c.id = p.categoria
                group by
                        c.nombre
                ,       EXTRACT(DAY FROM o.fecha)
                ) as GroupByDay
        ) as WithRowNumber
where   rn = 1

Подзапрос для row_number может быть необязательным, но у меня нет тестового Oracle поблизости.

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