SQL-запрос на поиск похожих значений, если они соответствуют некоторым условиям

#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