SQL - выбор строк на основе иерархии условий - PullRequest
0 голосов
/ 28 августа 2009

Было бы здорово, если бы был ПОЛОЖИТЕЛЬНЫЙ ответ на этот вопрос ...

Можно ли сделать выбор SQL на основе порядка возможных значений условия.

Например.

Rows
ID Type
2  Dog
2  Cat
4  Cat
5  Cat

Как видите, идентификаторы первых двух строк одинаковы. Поэтому я бы хотел выбрать 1 строку в каждой группе в порядке предпочтения, поэтому сначала «Собака». Если «Собака» не существует, выберите «Кошка»

Е.Г.

SELECT ID, Type
FROM pets
WHERE Type = "Dog, Cat"
GROUP BY ID

Результаты будут ...

ID Type
2  Dog
4  Cat
5  Cat

Ответы [ 4 ]

1 голос
/ 28 августа 2009

Я полностью согласен с ответом Ракса Олгуд. Также можно добавить подсказку для использования функции ROW_NUMBER с синтаксисом раздела - вы получите возможность записать более сложное условие (затем MAX (Тип). Затем в разделе WHERE просто отфильтруйте записи по rownum_alias = 1

Обновление:

select * from (
select ID, Type, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Type DESC) rn
FROM #temp
) a where rn = 1

В отличие от решения GROUP BY это позволяет размещать любые столбцы в операторе выбора (не только группировку)

1 голос
/ 28 августа 2009

Если у вас есть другая таблица, которая ранжирует ваши параметры в порядке предпочтения, то просто сделайте что-то вроде этого:

SELECT pets.ID, pets.Type
FROM pets,petprefs
WHERE pets.Type=petprefs.Type
GROUP BY pets.ID
ORDER BY petprefs.rank

Тип с более низким значением ранга всегда будет выбираться перед типом (ами) с более высоким рангом.

1 голос
/ 28 августа 2009

Я не уверен, каково ваше "реальное" требование, но в качестве примера вы можете использовать:

SELECT ID, Max(Type)
FROM pets
WHERE Type IN ('Dog', 'Cat')
GROUP BY ID

Примечания:

  1. Предложение IN требуется, только если вы хотите ограничить типы. Он может быть удален, если вы хотите, чтобы все типы были включены в запрос.
  2. Этот запрос работает, если упорядочение, с помощью которого вы устанавливаете приоритеты типов, может быть выполнено с использованием сортировки по алфавиту или по номерам. Если это так, использование Min или Max вместе с GROUP BY является самым простым и наиболее эффективным решением. Однако если ваши приоритеты основаны на каком-то конкретном порядке упорядочения, справочной таблице и т. Д., Вам потребуется другое решение, в котором у вас есть отдельная таблица, содержащая приоритеты и включенная в основной запрос, как ответил astander.
0 голосов
/ 28 августа 2009

Если группировка (как в ответе выше) не вариант, взгляните на функции ранжирования, представленные в SQL Server 2005.

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