Найти уникальное подмножество

#sql

#sql

Вопрос:

Я пытаюсь запросить 4 столбца A, B, C и D, чтобы найти записи, в которых на A / B.

Отношения иерархичны от A до D; на C может быть несколько Ds, несколько Cs на B и т.д.

например, здесь я хочу найти запись 2 из столбца A, потому что столбцы A и B одинаковы, но C и D разные

 A   B   C   D
-------------
1   1   1   1
1   1   2   1
1   1   3   1
2   1   1   1
2   1   2   2
  

Я решил сгруппировать все 4 и использовать having количество d> 1, но это, как ни странно, не возвращает результатов, когда их должно быть много.

Есть ли какой-либо способ сделать это, не используя целую кучу подзапросов, или это единственный способ?

ПРИМЕЧАНИЕ: данные не числовые, выше приведен только пример. Фактические данные имеют строковый тип.

Комментарии:

1. найти записи, в которых на A / B приходится более 1 D не то же самое, что я хочу найти запись 2 из столбца A, потому что столбцы A и B одинаковы, но C и D разные . Имеет ли C какое-либо значение в этом требовании?

2. @Mithrandir Я имел в виду столбец A, в таблице 1 и 2 есть два подмножества

3. @forpas На самом деле, я думаю, нет, нет

Ответ №1:

Вы можете сгруппировать по a, b и задать условие в предложении having:

 select a, b
from tablename
group by a, b
having count(distinct d) > 1
  

Если вы хотите, чтобы все строки и столбцы таблицы соответствовали вашим условиям:

 select t.*
from tablename t 
inner join (
    select a, b
    from tablename
    group by a, b
    having count(distinct d) > 1
) d on d.a = t.a and d.b = t.b
  

Ответ №2:

Это то, что вы хотите?

 select a
from t
group by a
having min(d) <> max(d);
  

Или, если вы хотите, чтобы оба c и d были приняты во внимание:

 having min(c) <> max(c) and min(d) <> max(d);
  

Комментарии:

1. Извините, следовало объяснить, что данные не числовые, это было просто для примера, это строки

2. @Absinthe . . . Числовые данные не имеют никакого отношения к этому ответу. Я не уверен, что вы пытаетесь сказать в своем комментарии. Часто max() и min() имеют лучшую производительность, чем count(distinct) .

3. Я предположил, что min и max работают только с числовыми данными, но, попробовав ваш запрос, он работает. Можете ли вы подробнее рассказать о том, почему min и max работают с нечисловыми данными?

4. @Absinthe . . . Ваше предположение неверно. min() и max() работают практически с каждым типом данных. Я бы также отметил, что этот ответ не только правильный, но и был на несколько минут раньше, чем другой ответ.

5. Хорошо, я сожалею, что лишил вас некоторых моментов …? Ценю ответ, но, возможно, вы могли бы более подробно рассказать о том, почему это работает.