ВЫБЕРИТЕ уникальные группы - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть таблица со значениями вроде:

|---------------------|------------------|
|        USER         |        ITEM      |
|---------------------|------------------|
|        Abel         |         1        |
|---------------------|------------------|
|        Abel         |         2        |
|---------------------|------------------|
|        Bart         |         1        |
|---------------------|------------------|
|        Bart         |         2        |
|---------------------|------------------|
|        Curt         |         3        |
|---------------------|------------------|
|        Curt         |         4        |
|---------------------|------------------|
|        Dawn         |         5        |
|---------------------|------------------|
|        Emma         |         5        |
|---------------------|------------------|
|        Emma         |         6        |
|---------------------|------------------|
|        Emma         |         7        |
|---------------------|------------------|
|        Fina         |         6        |
|---------------------|------------------|

Из этой таблицы я хочу выбрать только те, которые не следуют:

  1. ПОЛЬЗОВАТЕЛИ могут иметь толькоодин элемент.

  2. ПОЛЬЗОВАТЕЛИ могут иметь более одного ПУНКТА, только если они имеют его вместе с другим ПОЛЬЗОВАТЕЛЕМ.

  3. Группа ПОЛЬЗОВАТЕЛЕЙ можетимеют только один общий элемент.

После этого:

  • Фина имеет только 1 пункт , она ОК и она не должна быть включена.
  • Эмма имеет 3 ЭЛЕМЕНТА , но два из них используются разными ПОЛЬЗОВАТЕЛЯМИ, поэтому она ОК и ее не следует включать.
  • Рассвет имеет только 1 ПУНКТ , у нее ОК , и ее не следует включать.
  • У Курта есть** 2 ПУНКТА , он НЕ ОК , и он должен быть включен
  • Барт и Авель имеют 2 общих элемента,они НЕ ОК и должны быть включены.

Возможно ли это с SQL или мне нужно сделать скрипт на другом языке?

По крайней мереМне нужно знать количество пользователей, которые НЕ в порядке

В лучшем случае, таблица со списком элементов , которые неправильны

1 Ответ

0 голосов
/ 06 декабря 2018

Для пользователей, имеющих более одного элемента, вы можете использовать оконные функции:

select user
from (select t.*, count(*) over (partition by item) as item_cnt
      from t
     ) t
where item_cnt = 1
group by user
having count(*) >= 2;

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

select distinct t1.user
from t t1 join
     t t2
     on t1.item = t2.item and t1.user <> t2.user
group by t1.user, t2.user
having count(*) > 1;

Окончательное решение - union этих двух запросов.

...