如何从表格中获取每个类别的名字? PostgreSQL

时间:2019-05-24 20:44:09

标签: sql postgresql

我有3个表分别称为交易,客户和票证。每张票都有一个类别(剧院,电影院或音乐会)。我想找到每个类别中购买次数最多的人的名字:

例如:

Category | Name |  Purchases
 Theater   George      5
 Cinema     Tom        12
 Cinema     Mary       12
 Concert    John       7

WITH PurchasesSum AS (
    SELECT Category,Customers.Name,COUNT(Transactions.Customer_ID) AS Purchases,
        RANK() OVER (ORDER BY COUNT(Transactions.Customer_ID) DESC) AS Rank
    FROM Transactions
    INNER JOIN Customers
        ON Transactions.Customer_ID= Customers.ID
    INNER JOIN Tickets
    ON Transactions.Ticket_num = Tickets.Ticket_num
    GROUP BY Name,Category
)

SELECT Name, Purchases,Category
FROM PurchasesSum 
ORDER BY Category ASC;

到目前为止,我到了这一步,但它返回了所有这些
例如:

Category | Name |  Purchases
 Cinema     Tom        12
 Cinema     Mary       12
 Cinema     John       3
 Concert    John       7
 Concert    Tom        1
 Theater   George      5
 Theater   Mary        2

2 个答案:

答案 0 :(得分:0)

您非常亲密。将OVER的{​​{1}}子句扩展到rank(),以便排名相对于类别。然后将PARTITION BY category子句放在外部查询过滤器中,排名为1。

WHERE

答案 1 :(得分:0)

在Postges中,我建议使用DISTINCT ON。它不仅更简洁,而且通常更快:

SELECT DISTINCT ON (Category) Category, c.Name, 
       COUNT(*) AS Purchases,
FROM Transactions t JOIN
     Customers c
     ON t.Customer_ID = c.ID JOIN
     Tickets ti
     ON t.Ticket_num = ti.Ticket_num
GROUP BY Category, c.Name
ORDER BY Category, COUNT(*) DESC;