Строки выбора SQL, в которых значение поля с несколькими значениями встречается только один раз - PullRequest
0 голосов
/ 05 июля 2018

У меня следующая проблема:

У меня есть таблица с различными столбцами, описывающими объекты. Предположим, что один из этого столбца может содержать значения 1,2,3,4,5,6,7,8,9,10. Внутри этой таблицы объекты могут содержать все эти значения, а некоторые могут содержать, например, значение 1,3,5 (от 0 до n значений)

Теперь я хочу найти все объекты, содержащие только значения 1 и 2, но я не хочу, чтобы они были в моем наборе результатов, если они содержат 1,2,3 или другие комбинации, кроме (1,2).

Как мне написать этот оператор SQL?

Пример данных (ожидаемый результат -> Марк и Майкл):

+---------+--------------------+---------------------------+--+
|   OBJ   | OBJ_CHARACTERISTIC | CHARACTERISTIC_DATE_ADDED |  |
+---------+--------------------+---------------------------+--+
| Mark    |                  1 |                15.01.2018 |  |
| Mark    |                  2 |                15.02.2018 |  |
| Jimmy   |                  1 |                31.01.2018 |  |
| Jimmy   |                  2 |                11.02.2018 |  |
| Jimmy   |                  4 |                15.03.2018 |  |
| Jimmy   |                  5 |                15.04.2018 |  |
| Jimmy   |                  6 |                15.04.2018 |  |
| Harry   |                  1 |                08.01.2018 |  |
| Harry   |                  2 |                11.01.2018 |  |
| Harry   |                  3 |                15.02.2018 |  |
| Michael |                  1 |                15.06.2018 |  |
| Michael |                  2 |                15.07.2018 |  |
| Dwayne  |                  4 |                15.01.2018 |  |
| Dwayne  |                  5 |                15.01.2018 |  |
| Dwayne  |                  6 |                15.01.2018 |  |
+---------+--------------------+---------------------------+--+

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете использовать аналитические подсчеты, чтобы увидеть, сколько характеристик имеет каждый объект, и сколько из них вы ищете; и затем сравните эти цифры:

select obj, obj_characteristic, characteristic_date_added
from (
  select obj, obj_characteristic, characteristic_date_added,
    count(distinct obj_characteristic) over (partition by obj) as c1,
    count(distinct case when obj_characteristic in (1,2) then obj_characteristic end)
      over (partition by obj) as c2
  from your_table
)
where c1 = c2;

С вашими образцами данных, которые дают:

OBJ     OBJ_CHARACTERISTIC CHARACTERI
------- ------------------ ----------
Mark                     1 2018-01-15
Mark                     2 2018-02-15
Michael                  1 2018-06-15
Michael                  2 2018-07-15

Судя по тому, как сформулирован вопрос, звучит так, будто вам нужны полные строки, как указано выше; Froma комментарий вы можете только имена. Если это так, вы можете просто изменить внешний выбор на:

select distinct obj
from ...

OBJ    
-------
Mark
Michael

или используйте агрегаты вместо этого с помощью предложения having:

select obj
from your_table
group by obj
having count(distinct obj_characteristic)
  = count(distinct case when obj_characteristic in (1,2) then obj_characteristic end);

OBJ    
-------
Mark
Michael

ДБ <> Скрипт демо из всех трех .


В этом случае, так как 1 и 2 являются смежными, вы также можете сделать это с min / max, как совокупность, чтобы просто получить имена:

select obj
from your_table
group by obj
having min (obj_characteristic) = 1
and max(obj_characteristic) = 2;

или аналитически для получения полных строк:

select obj, obj_characteristic, characteristic_date_added
from (
  select obj, obj_characteristic, characteristic_date_added,
    min(obj_characteristic) over (partition by obj) as min_char,
    max(obj_characteristic) over (partition by obj) as max_char
  from your_table
)
where min_char = 1
and max_char = 2;

но более ранние версии являются более общими.

0 голосов
/ 05 июля 2018

@ dwin90 Вы можете попробовать:

SELECT obj
FROM your_table
WHERE (OBJ_CHARACTERISTIC=1 OR OBJ_HARACTERISTIC=2 AND OBJ_CHARACTERISTIC !> 2
)GROUP BY OBJ
0 голосов
/ 05 июля 2018

Если вы просто ищете sql для возврата значений строк '1,2' и больше ничего не используете:

select * from table where column like '%1,2'

Опубликуйте пример данных, это может быть более полезным для понимания.

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