簡體   English   中英

如何使用 mySQL 為另一列中的每個值返回最常見的列值?

[英]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

DB Fiddle 上的演示

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

DB Fiddle 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM