SQL - Как получить строки с самым высоким рангом в столбце с несколькими дублирующимися строками в другом - PullRequest
2 голосов
/ 31 октября 2019

Я совершенно новичок в SQL, так что это может быть нубский вопрос:

Допустим, мой запрос:

select [Item], [Answers] from table1

И он получает следующую таблицу:

Item     Answers
------------------
Car      Expensive
Car      Cheap
Car      Medium
Boat     Expensive
Boat     Very Expensive
Boat     Ultra Expensive

Учитывая определенную вторую таблицу (или словарь, я действительно не знаю, как это сделать) {Дешево: 1, Среднее: 2, Дорого: 3, Очень Дорого: 4, Ультра Дорого: 5} -это означает, что «Ультра дорогой» является наивысшим, а «Дешевый» - наименьшим.

В SQL, для таблиц такого типа с большим количеством дубликатов в столбце A (элемент), как получить значение с наибольшим рейтингом в столбце B (ответы) для каждого уникального значения в столбце A?

В этом примере я хотел бы получить:

Item     Answers
------------------
Car      Expensive
Boat     Ultra Expensive

Только одно из каждого дублированного значения в столбце «Элемент» и его самое высокое ранжированное возможное значение в «Ответах»?

1 Ответ

2 голосов
/ 31 октября 2019

Вы можете использовать коррелированный подзапрос:

select item, answer
from table1 t
where answer = (
    select top 1 answer
    from table1 t1
    where t1.item = t.item
    order by
        case answer
            when 'Cheap' then 1
            when 'Medium' then 2
            when 'Expensive' then 3
            when 'Very Expensive' then 4
            when 'Ultra Expensive' then 5
        end desc
)

Фильтр подзапроса для answer, который имеет наивысший ранг для данного item, использует условное предложение order by и top 1.

Другой вариант - использовать row_number() для фильтрации:

select item, answer 
from (
    select 
        item, 
        answer,
        row_number() over(
            partition by item 
            order by case answer
                when 'Cheap' then 1
                when 'Medium' then 2
                when 'Expensive' then 3
                when 'Very Expensive' then 4
                when 'Ultra Expensive' then 5
            end desc
        ) rn
    from table1
) t
where rn = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...