我正在使用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|
答案 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一起玩。一切顺利。