用于查找按值分组的最频繁值的SQL查询

时间:2016-09-11 04:14:06

标签: sql sqlite sql-update

我正在使用SQLite浏览器,我正在尝试查找一个查询,该查询可以找到每个分组的最大值,来自另一列的值:

表名为main

|  |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|

2 个答案:

答案 0 :(得分:2)

您可以按地点分组,然后按价值分组,并按频率排序,例如

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来解决您的问题。

答案 1 :(得分:0)

第一部分就是这样。

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一起玩。一切顺利。