2014-10-16 5 views
0

Таким образом, у меня есть таблица, с которой отдельные лица (person_id) имеют несколько линий (до 4) и значения для столбца (VALUE_COLUMN) может либо = 0 или 1SQL-группы: где значения одинаковы в пределах группы

Я хотел бы написать фрагмент кода, который возвращает строку для каждого person_id, в которой их значение для value_column равно только 0 или только 1 (хотя они могут иметь по 3 или 4 строки)

Это, вероятно, простая строка кода, но для тех, у кого меньше опыта SQL, это кажется почти невозможным!

EDIT: здесь быстрый образец линий:

person_id value_column 
A   0 
A   1 
A   0 
B   0 
B   0 
B   0 
B   0 
C   1 
C   1 
C   1 

И я бы ожидать, что строки кода, чтобы вернуться на следующие:

person_id value_column 
B   0 
C   1 
+1

Пожалуйста отправьте образец строк вместе с образцом того, что можно было бы ожидать результаты запроса, чтобы быть. –

+0

Итак, ваше намерение состоит в том, чтобы исключить 'person_id = 'A'', потому что' A 'имеет _both_ a 0 или 1? –

+0

Да, и возвращать только одну строку для person_id = 'B' и person_id = 'C' – gh0strider18

ответ

2

Вы можете попробовать что-то вроде этого, вероятно,

select distinct * from table1 
where person_id in 
(select person_id 
    from table1 
    group by person_id 
    having count(distinct value_column) <= 1 
) 

Внутренний запрос, вернет только те person_id, для которых существует только o ne value_column, и это то же самое, что делается count(distinct value_column) <= 1, а затем внешний запрос просто выбирает все для person_id.

+1

Пожалуйста, добавьте объяснение для OP и будущих читателей о том, как работает «HAVING COUNT (DISTINCT)» ... –

+0

Да определенно, и он был прерван отключением питания. Anyways добавил теперь. Спасибо, что указали это. – Rahul

+0

Очень близко, но вместо того, чтобы возвращать несколько повторяющихся значений person_id, как я могу вернуть только одну строку на person_id? То есть, теперь мы знаем, что возвращаемые person_ids все имеют только одно отличное значение column_value, то как мы можем вернуть только один уникальный экземпляр каждого из них? – gh0strider18

0
select * from myTable where person_id not in 
(select a.person_id from myTable a, myTable b 
    where a.person_id = b.person_id 
    and a.value_column <> b.value_column) 

Получить людей с разными значениями, а затем получить тех, кто не находится в этом первом запросе.

Или быстрее и лучше:

select person_id, min(value_column) 
from myTable 
group by person_id 
having min(value_column)=max(value_column) 
+0

попробуйте второй –

Смежные вопросы