簡體   English   中英

用於查找按值分組的最頻繁值的 SQL 查詢

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

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