Получите наиболее распространенное значение для каждого значения другого столбца в SQL

24
задан Ciro Santilli 新疆改造中心法轮功六四事件 7 September 2015 в 19:32
поделиться

6 ответов

SELECT DISTINCT
"F1"."food",
"F1"."country"
FROM "foo" "F1"
WHERE
"F1"."food" =
    (SELECT "food" FROM
        (
            SELECT "food", COUNT(*) AS "count"
            FROM "foo" "F2" 
            WHERE "F2"."country" = "F1"."country" 
            GROUP BY "F2"."food" 
            ORDER BY "count" DESC
        ) AS "F5"
        LIMIT 1
    )

ну, я записал это второпях и не проверял его действительно хорошо. Подвыбор мог бы быть довольно медленным, но это - самый короткий и самый простой SQL-оператор, о котором я мог думать. Я, вероятно, скажу больше, когда я буду меньше пьяный.

пз: О, хорошо "нечто" является названием моей таблицы, "еда" содержит название еды и "страны" название страны. Демонстрационный вывод:

   food    |  country   
-----------+------------
 Bratwurst | Germany
 Fisch     | Frankreich
8
ответ дан jkramer 28 November 2019 в 23:03
поделиться

попробуйте это:

Select Country, Food_id
From Munch T1
Where Food_id= 
    (Select Food_id
     from Munch T2
     where T1.Country= T2.Country
     group by Food_id
     order by count(Food_id) desc
      limit 1)
group by Country, Food_id
5
ответ дан Jamal Hansen 28 November 2019 в 23:03
поделиться

Вот то, как сделать это без любых временных таблиц:

Редактирование: упрощенный

select nf.country, nf.food_id as most_frequent_food_id
from national_foods nf
group by country, food_id 
having
  (country,count(*)) in (  
                        select country, max(cnt)
                        from
                          (
                          select country, food_id, count(*) as cnt
                          from national_foods nf1
                          group by country, food_id
                          )
                        group by country
                        having country = nf.country
                        )
3
ответ дан JosephStyons 28 November 2019 в 23:03
поделиться
SELECT country, MAX( food_id )
  FROM( SELECT m1.country, m1.food_id
          FROM munch m1
         INNER JOIN ( SELECT country
                           , food_id
                           , COUNT(*) as food_counts
                        FROM munch m2
                    GROUP BY country, food_id ) as m3
                 ON m1.country = m3.country
         GROUP BY m1.country, m1.food_id 
        HAVING COUNT(*) / COUNT(DISTINCT m3.food_id) = MAX(food_counts) ) AS max_foods
  GROUP BY country

мне не нравится, когда МАКС.(.) GROUP BY повреждает связи... Существует, должен быть способ включить съеденную дату в СОЕДИНЕНИЕ в некотором роде для произвольного выбора нового...

мне интересно на плане запросов для этой вещи, если Вы выполняете его на своих живых данных!

3
ответ дан Matt Rogish 28 November 2019 в 23:03
поделиться
select country,food_id, count(*) ne  
from   food f1  
group by country,food_id    
having count(*) = (select max(count(*))  
                   from   food f2  
                   where  country = f1.country  
                   group by food_id)  
3
ответ дан Theo 28 November 2019 в 23:03
поделиться

Попробуйте что-то вроде этого

select country, food_id, count(*) cnt 
into #tempTbl 
from mytable 
group by country, food_id

select country, food_id
from  #tempTbl as x
where cnt = 
  (select max(cnt) 
  from mytable 
  where country=x.country 
  and food_id=x.food_id)

, Это могло быть помещено все в единственный выбор, но у меня нет времени для слоняний без дела с ним прямо сейчас.

Удача.

3
ответ дан John MacIntyre 28 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: