Выбор SQL с предпочтением значения столбца - PullRequest
4 голосов
/ 03 апреля 2019

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

+----------+----------+------+
| ENTRY_ID | ROUTE_ID | TYPE |
+----------+----------+------+
|        1 |       15 |    0 |
|        1 |       26 |    1 |
|        1 |       39 |    1 |
|        2 |       22 |    1 |
|        2 |       15 |    1 |
|        3 |       30 |    1 |
|        3 |       35 |    0 |
|        3 |       40 |    1 |
+----------+----------+------+

В приведенной выше таблице я хотел бы выбрать 1 запись для каждой ENTRY_ID со следующим предпочтением для возвращенных ROUTE_ID:

  1. IF TYPE = 0 доступно для любой из записей с одинаковым ENTRY_ID, возвращает минимальное значение ROUTE_ID для всех записей сTYPE = 0
  2. Если для того же самого ENTRY_ID доступно только TYPE = 1, вернуть минимум ROUTE_ID

Ожидаемый результат для запроса будет следующим:

+----------+----------+------+
| ENTRY_ID | ROUTE_ID | TYPE |
+----------+----------+------+
|        1 |       15 |    0 |
|        2 |       15 |    1 |
|        3 |       35 |    0 |
+----------+----------+------+

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 03 апреля 2019

Вы можете группировать по TYPE и ENTRY_ID, а затем использовать предложение HAVING, чтобы отфильтровать те, где TYPE не является минимальным значением для этой записи.

SELECT ENTRY_ID, MIN(ROUTE_ID), TYPE
FROM MyTable
GROUP BY ENTRY_ID, TYPE
HAVING TYPE = (SELECT MIN(s.TYPE) FROM MyTable s WHERE s.ENTRY_ID = MyTable.ENTRY_ID)

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

3 голосов
/ 03 апреля 2019

Если вы хотите заполнить строки, используйте коррелированный подзапрос:

select t.*
from t
where t.route_id = (select top 1 t2.route_id
                    from t as t2
                    where t2.entry_id = t.entry_id
                    order by iif(t2.type = 0, 1, 2),  -- put type 0 first
                             t2.route_id asc  -- then the first route_id
                   );

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

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