[英]SQL query for finding the most frequent value of a grouped by value
我正在使用 SQLite 瀏覽器,我試圖找到一個查詢,該查詢可以找到每個按來自另一列的值分組的最大值:
表稱為主表
| |Place |Value|
| 1| London| 101|
| 2| London| 20|
| 3| London| 101|
| 4| London| 20|
| 5| London| 20|
| 6| London| 20|
| 7| London| 20|
| 8| London| 20|
| 9| France| 30|
| 10| France| 30|
| 11| France| 30|
| 12| France| 30|
我正在尋找的結果是找到最常見的按位置分組的值:
| |Place |Most Frequent Value|
| 1| London| 20|
| 2| France| 30|
甚至更好
| |Place |Most Frequent Value|Largest Percentage|2nd Largest Percentage|
| 1| London| 20| 0.75| 0.25|
| 2| France| 30| 1| 0.75|
您可以按位置分組,然后按值分組,並按頻率排序,例如。
select place,value,count(value) as freq from cars group by place,value order by place, freq;
這不會給出你想要的答案,但接近它就像
London | 101 | 2
France | 30 | 4
London | 20 | 6
現在從這個中間表中選擇地點和值並按地點分組,這樣每個地點只顯示一行。
select place,value from
(select place,value,count(value) as freq from cars group by place,value order by place, freq)
group by place;
這將產生如下結果:
France | 30
London | 20
這適用於 sqlite。 但是對於其他一些程序,它可能無法按預期工作並以最少的頻率返回位置和值。 在這些中,您可以order by place, freq desc
來解決您的問題。
第一部分將是這樣的。
http://sqlfiddle.com/#!7/ac182/8
with tbl1 as
(select a.place,a.value,count(a.value) as val_count
from table1 a
group by a.place,a.value
)
select t1.place,
t1.value as most_frequent_value
from tbl1 t1
inner join
(select place,max(val_count) as val_count from tbl1
group by place) t2
on t1.place=t2.place
and t1.val_count=t2.val_count
在這里,我們導出tbl1
,它將為我們提供每個位置和值組合的計數。 現在我們將把這個數據與另一個派生表t2
連接起來,它會找到最大計數,我們將連接這個數據以獲得所需的結果。
我不確定您希望第二個輸出中的percentage
如何,但是如果您了解此查詢,則可以在其之上使用一些邏輯來得出所需的輸出。 玩弄 sqlfiddle。 一切順利。
秩
SQLite 現在支持RANK
,因此我們可以使用與 PostgreSQL 完全相同的語法,類似於https://stackoverflow.com/a/12448971/895245
SELECT "city", "value", "cnt"
FROM (
SELECT
"city",
"value",
COUNT(*) AS "cnt",
RANK() OVER (
PARTITION BY "city"
ORDER BY COUNT(*) DESC
) AS "rnk"
FROM "Sales"
GROUP BY "city", "value"
) AS "sub"
WHERE "rnk" = 1
ORDER BY
"city" ASC,
"value" ASC
如果出現平局,這將全部返回。 要只返回一個,您可以使用ROW_NUMBER
而不是RANK
。
在 SQLite 3.34.0 和 PostgreSQL 14.3 上測試。 GitHub 上游.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.