SQL-запрос для фильтрации записей на основе отсутствия значений в группе - PullRequest
1 голос
/ 18 марта 2011

Я ломал голову и гуглил, чтобы найти решение, и я подозреваю, что, возможно, не задаю вопрос четко, поэтому, пожалуйста, потерпите меня.

Мне нужно создать пару запросов, которые фильтруют записи на следующей основе. Хотя при извлечении данных участвуют несколько таблиц, я придерживаюсь основного требования.

Ниже приведены примеры значений:

Key | Decision   
123 |  Complete  
123 | Additional info  
123 | Something  
123 | Complete
.  
.  
.  
254 | Complete  
254 | Complete  
254 | Complete  
.  
.  
.  

На основании приведенных выше данных я могу сделать выбор и сгруппировать по ключу и решению, чтобы получить набор данных следующим образом:

Key | Decision  
123 | Complete  
123 | Additional info  
123 | Something  
.  
.  
.  
254 | Complete   
.  
.  
.

Фактические данные, которые мне нужны, бывают двух типов (это отдельные запросы, которые необходимо построить)

1) Ключи, в которых единственным решением является «Завершено» - в приведенном выше примере только Key = 254 будет соответствовать
2) Ключи, в которых решение может содержать «Дополнительная информация» - в приведенном выше примере только Key = 123 будет соответствовать

Это кажется почти возможным, как будто у меня где-то есть ответ, и я не могу его понять. Или это желаемое за действительное?

Я попробовал следующее

select key from table where decision not in (select key from table where decision <> "Complete") 

Это дает мне желаемый результат для Решения = Завершено. Однако, поскольку окончательный выбор, по крайней мере, содержит как минимум три объединения, я подозреваю, что производительность будет плохой. Запросы будут выполняться в Oracle 11g.

Если у кого-нибудь есть предложения, которые помогут мне выбраться из этой колеи идей, я был бы очень признателен.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

За первый вопрос

select `key` from your_table
group by key
having count(decision) = sum(decision="complete")

для второго

select `key` from your_table
where decision = 'Additional Info'
group by `key`
0 голосов
/ 19 марта 2011

1) Ключи, в которых единственным решением является «Выполнено» - в приведенном выше примере только ключ = 254 будет соответствовать

select key
  from table
 group 
    by key
having min(decision) = 'Complete'
   and max(decision) = 'Complete'

или то, что @nick rulez написал со следующей модификацией (чтобы она также работала в Oracle):

having count(decision) = sum(case when decision = 'Complete' then 1 else 0 end)

2) Ключи, в которых решение может содержать «Дополнительная информация» - в приведенном выше примере только Key = 123 будет соответствовать

select distinct key 
  from table
 where decision = 'Additional info';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...