我有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
答案 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;