2016-09-11 6 views
1

Я использую SQLite браузер, я пытаюсь найти запрос, который может найти максимум каждого сгруппированных по значению из другого столбца из:SQL-запрос для поиска наиболее часто встречающееся значение из сгруппированных по значению

Таблица называется основным

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

Вы можете группировать по месту, затем значение и порядок по частоте, например.

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

Спасибо! Это не дало мне наиболее частого значения, но наименее часто, поэтому я перешел на ASC от DESC и все было хорошо. – OwnThisField

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. Всего наилучшего.

Смежные вопросы