SQL: Сколько строк имеют данный столбец как их максимум (из списка столбцов) - PullRequest
0 голосов
/ 06 сентября 2018

Я только начал изучать SQL (в частности, SQLite), и я играл с этими данными.

У каждого персонажа Marvel в этом списке есть рейтинг для каждого атрибута (сила, интеллект, скорость и т. Д.). Я хочу узнать, сколько персонажей имеют каждый атрибут как самый высокий. Например, сколько персонажей имеют силу как их самый большой атрибут?

Мы можем предположить, что если персонаж имеет два или более атрибута в качестве наивысшего значения, этот символ будет учитываться для каждого атрибута.

Результат, который я ожидаю, выглядит примерно так:

best_Attribute      COUNT(*)
__________________________________
intelligence            a
strength                b
speed                   c
durability              d
energy_Projection       e
fighting_Skills         f

Вот моя попытка:

SELECT COUNT(*),
    CASE
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == intelligence THEN "intelligence"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == strength THEN "strength"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == speed THEN "speed"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == durability THEN "durability"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == energy_Projection THEN "energy_Projection"
        WHEN MAX(intelligence, strength, speed, durability, energy_Projection, fighting_Skills) == fighting_Skills THEN "fighting_Skills"
    END as "best_Attribute"
FROM marvels
GROUP BY best_Attribute;

Это уродливо, многословно и даже не работает. Вот вывод:

COUNT(*)    best_Attribute
__________________________
    2               4
    3               6
    7               7

Есть ли (хороший) способ получить желаемый результат?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

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

with a as (
      select name, 'intelligence' as attribute, intelligence as val
      from marvels
      union all
      select name, 'strength' as attribute, strength as val
      from marvels
      union all
      select name, 'speed' as attribute, speed as val
      from marvels
      union all
      select name, 'durability' as attribute, durability as val
      from marvels
      union all
      select name, 'energy_Projection' as attribute, energy_Projection as val
      from marvels
      union all
      select name, 'fighting_Skills' as attribute, fighting_Skills as val
      from marvels
     )
select a.attribute, count(*) as num_with_max
from a
where a.val = (select max(a2.val) from a a2 where a2.name = a.name)
group by a.attribute;
0 голосов
/ 06 сентября 2018

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

SELECT
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = intelligence THEN 1 END) AS intelligence_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = strength THEN 1 END) AS strength_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = speed THEN 1 END) AS speed_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = durability THEN 1 END) AS durability_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = energy_Projection THEN 1 END) AS energy_Projection_count
    COUNT(CASE WHEN MAX(intelligence, strength, speed, durability, energy_Projection,
        fighting_Skills) = fighting_Skills THEN 1 END) AS fighting_Skills_count
FROM marvels;

Обратите внимание, что вам не нужно использовать GROUP BY здесь, если вы хотите получить итоги по всей таблице.

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