Сравнивая значения из строк с одинаковым идентификатором группы? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь написать запрос SQL для выполнения следующих действий:

Учитывая следующую таблицу:

+----+----------+-----------+
| id | group_id | value     |
+----+----------+-----------+
| 1  | 1        | 0         |
+----+----------+-----------+
| 2  | 1        | 0         |
+----+----------+-----------+
| 3  | 2        | null      |
+----+----------+-----------+
| 4  | 3        | -1        |
+----+----------+-----------+
| 5  | 3        | 1         |
+----+----------+-----------+
| 6  | 4        | something |
+----+----------+-----------+
| 7  | 5        | something |
+----+----------+-----------+

выберите *, где значения не равны друг другу в группе по group_id

Для этого примера выходные данные должны быть:

+----+----------+-----------+
| id | group_id | value     |
+----+----------+-----------+
| 4  | 1        | -1        |
+----+----------+-----------+
| 5  | 1        | 1         |
+----+----------+-----------+

Кто-нибудь знает, возможно ли это?

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Вы можете сделать с exists, чтобы получить group_id, который не имеет того же значения. здесь демо .

select
    distinct group_id
from data d1
where exists
(
    select
        group_id
    from data d2
    where d1.group_id = d2.group_id
    and d1.value <> d2.value
)

Вывод

*--------*
|group_id|
*--------*
|     3  |
*--------*

Если вы хотите, чтобы group_id и value оба, попробуйте следующее

select
    group_id,
    value
from data d1
where exists
(
    select
        group_id
    from data d2
    where d1.group_id = d2.group_id
    and d1.value <> d2.value
)

Выход:

*------------------*
|group_id |  value |
*------------------*
|     3  |    -1   |
|     3  |     1   |
*------------------*
1 голос
/ 01 мая 2020

Если вы хотите найти только значения group_id, которые имеют различные значения value, вы можете использовать этот запрос:

SELECT group_id
FROM data
GROUP BY group_id
HAVING MIN(value) != MAX(value)

Вывод данных для образца:

group_id
3

Если вы хотите получить строки, связанные с этим group_id, используйте указанный выше запрос в качестве подзапроса для выражения IN:

SELECT *
FROM data
WHERE group_id IN (
  SELECT group_id
  FROM data
  GROUP BY group_id
  HAVING MIN(value) != MAX(value)
)

Вывод

id  group_id    value
4   3           -1
5   3           1

Демонстрация на dbfiddle

0 голосов
/ 01 мая 2020

Этот запрос:

select group_id
from tablename
group by group_id
having count(distinct value) > 1 and count(distinct value) = count(value)

возвращает нужные вам group_id s, поэтому используйте его с оператором IN:

select * from tablename
where group_id in (
  select group_id
  from tablename
  group by group_id
  having count(distinct value) > 1 and count(distinct value) = count(value)
) 

См. Демонстрационную версию . Результаты:

| id  | group_id | value |
| --- | -------- | ----- |
| 4   | 3        | -1    |
| 5   | 3        | 1     |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...