Подсчет максимального значения в SQL (PostgreSQL) - PullRequest
0 голосов
/ 17 мая 2019

У меня есть база данных с 3 таблицами (клиенты, билеты, company_transactions).

клиентов (customer_id, полное имя)

tickets (ticket_id, тип, цена, начальная дата, конечная дата, категория)

company_transactions (транзакция_id, customer_id, тикет_идента, покупка_дата, транзакция)

Иностранные ключи: customer_id -> клиенты.customer_id, ticket_id -> tickets.ticket_id

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

select tickets.category, CT.customer_id, customers.full_name
    , count(category) as amount
    FROM company_transactions as CT
    INNER JOIN tickets ON CT.ticket_id = tickets.ticket_id
    INNER JOIN customers ON CT.customer_id = customers.customer_id
GROUP BY CT.customer_id, customers.full_name, tickets.category    
having count(category) =
            (select max(amount)
                 from (
                 select tickets.category, CT.customer_id, customers.full_name
                 , count(category) as amount
                 from company_transactions as CT
                 INNER JOIN tickets ON CT.ticket_id = tickets.ticket_id
                 INNER JOIN customers ON CT.customer_id = customers.customer_id
             group by CT.customer_id, customers.full_name, tickets.category
             ) as t
    )
order by amount DESC;

Я ожидал получитьмаксимальное количество покупок билетов для каждой категории и кто был клиентом (имя клиента), у которого есть этот номер, но вместо этого он получил только максимальное количество покупок билетов для всех категорий.

1 Ответ

1 голос
/ 17 мая 2019

Использование distinct on:

SELECT DISTINCT ON (t.category) t.category, CT.customer_id, c.full_name, count(category) as amount
FROM company_transactions CT JOIN
     tickets t
     ON CT.ticket_id = t.ticket_id JOIN
     customers c
     ON CT.customer_id = c.customer_id
GROUP BY CT.customer_id, c.full_name, t.category    
ORDER BY t.category, amount DESC;
...