[英]How do I return the most common column value for each value in another column using mySQL?
我正在尋找一個棘手的 MySQL 查詢來為另一列中的每個值返回最常見的列值。 我可以使用 PHP 來根據每個結果來完成它,但是使用單個查詢來完成它會更酷:)
例如,如果有一個這樣的表,稱為“事務”:
Id payee exp category
1 Amazon 25.00 Gifts
2 Amazon 30.21 Books
3 Amazon 12.98 Gifts
4 Amazon 15.00 Groceries
5 Amazon 14.54 Gifts
6 Alibaba 55.55 Stock
7 Alibaba 99.00 Stock
8 Alibaba 12.00 Fun
…
我想要的結果類型是這樣的:
payee count(payee) category
Amazon 3 Gifts
Alibaba 2 Stock
…
我可以做這個:
SELECT `payee`, COUNT(`payee`), `category` FROM `transactions` WHERE 1 GROUP BY category ORDER BY COUNT(`payee`) DESC
並接近我想要的:
Amazon 3 Gifts
Alibaba 2 Stock
Amazon 1 Books
Amazon 1 Groceries
Alibaba 1 Fun
但我不想要非最大計數(例如 Amazon、1、Books)。
我必須做一個子查詢還是什么? 還是用在?
你可以過濾與在相關子查詢現有查詢的結果having
子句,如下所示:
select payee, count(*), category
from transactions t
group by payee, category
having count(*) = (
select count(*)
from transactions t1
where t1.payee = t.payee
group by category
order by count(*) desc limit 1
)
order by count(*) desc
payee | count(*) | category :------ | -------: | :------- Amazon | 3 | Gifts Alibaba | 2 | Stock
或者,如果您運行的是 MySQL 8.0,您可以使用窗口函數rank() over()
對每個收款人的類別進行rank() over()
,並過濾每組的最高記錄:
select payee, cnt, category
from (
select
payee,
count(*) cnt,
category,
rank() over(partition by payee order by count(*) desc) rn
from transactions
group by category, payee
) t
where rn = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.