#sql
Вопрос:
У меня конкретная проблема, и я не нашел никаких ресурсов, которые могли бы мне помочь. Может быть, я плохо искал или, может быть, невозможно делать то, что я хочу. Я просто изменил название своих столбцов, но дух остался прежним.
ID | ID_House | ID_Postman | ID_Vehicule |
---|---|---|---|
1 | H1 | P1 | V1 |
2 | H1 | P1 | V3 |
3 | H1 | P2 | V1 |
4 | H1 | P2 | V2 |
5 | H2 | P1 | V1 |
6 | H3 | P1 | V1 |
7 | H4 | P3 | V3 |
Можно ли найти ID_postman общего со списком ID_House, но он должен быть строгим? Например, если я хочу, чтобы ID_postman совпадал с [H1, H2, H3], я должен иметь :
ID_Postman |
---|
P1 |
Но если я хочу, чтобы ID_postman совпадал с [H1, H2, H4] , у меня не должно быть результатов.
где ID_house in (‘H1′,’H2′,’H4’) => результат : нет, где ID_house in (‘H1′,’H2′,’H3’) => результат : P1
Комментарии:
1. пожалуйста, добавьте СУБД, которую вы используете. SQL != SQL …
Ответ №1:
Кажется сложнее, чем кажется на первый взгляд, но попробуйте следующее в качестве возможного решения, оно должно работать в большинстве стандартных аналитических функций, совместимых с платформами СУБД.
with x as (
select id_house, id_postman,
Count(*) over(partition by id_postman) pq
from t
where id_house in ('h1','h2','h3')
group by id_house,id_postman
)
select id_postman
from x
where pq=(select Count(distinct id_house) from x)
group by id_postman
Смотрите пример рабочей скрипки
Комментарии:
1. Спасибо! У меня есть хороший ответ на этот вопрос. Жаль, что нет более простого решения.
Ответ №2:
У меня была такая проблема. Чтобы решить эту проблему, я нашел уникальный способ представления целевого значения как конкатенации упорядоченной строки.
С помощью функции Windows (или просто групповых запросов) вы можете связать каждого почтальона с его ids_house
Что-то вроде
ID | ID_House | ID_Postman | ID_Vehicule | IDs_House |
---|---|---|---|---|
1 | H1 | P1 | V1 | H1_H2_H3 |
2 | H1 | P1 | V3 | H1_H2_H3 |
3 | H1 | P2 | V1 | H1 |
4 | H1 | P2 | V2 | H1 |
5 | H2 | P1 | V1 | H1_H2_H3 |
6 | H3 | P1 | V1 | H1_H2_H3 |
7 | H4 | P3 | V3 | H4 |
Хитрость заключается в том, чтобы убедиться, что в вашем сборе id_house нет двусмысленности, используйте order by .
Должны существовать более элегантные способы исправить это, но у меня это сработало.
Комментарии:
1. На самом деле это интересно, и вы могли бы предоставить соответствующий код SQL. Затем завершите свой запрос, проверив список значений, которые мы ищем, в конце у вас будет один единственный запрос, выполняющий задание 😉
Ответ №3:
Вероятно, вы ищете запрос, подобный этому:
SELECT ID_Postman FROM my_table
WHERE ID_House IN ('H1', 'H2', 'H4);
Комментарии:
1. Это вернет P1 и P2
2. Это не то, чего я хочу. где ID_house in (‘H1′,’H2′,’H4’) => результат : нет, где ID_house in (‘H1′,’H2′,’H3’) => результат : P1