Считать, только если выполнено условие в другом столбце - PullRequest
1 голос
/ 02 июля 2019

Я должен считать идентификаторы, только если соблюдены другие условия столбцов.Идентификаторы не уникальны, так как могут включать несколько шагов.

Таблица выглядит следующим образом:

rownum | ID | key   | result

1      |100 | step1 | accepted
2      |100 | step2 | accepted
3      |100 | step3 | transfer
4      |101 | step0 | accepted
5      |101 | step1 | accepted
6      |101 | step2 | rejected
7      |102 | step0 | accepted
8      |102 | step1 | accepted
9      |103 | step1 | rejected
10     |104 | step1 | rejected
11     |104 | step1 | rejected
12     |104 | step1 | rejected

В примере у меня есть 5 идентификаторов (но в реальной таблице их тысячи), и у меня естьCOUNT только идентификаторы, где условие выполнено.Условие довольно простое: key <> 'step0', таким образом, мой скрипт COUNT должен вернуть значение 3.

Если я попытаюсь

COUNT ID
FROM myTable
WHERE key <> 'step0'

, он вернет неправильное значение, так как предложение WHERE применяется ранееCOUNT

Любые идеи приветствуются.

Ответы [ 5 ]

2 голосов
/ 02 июля 2019

Вот метод, который не требует вложенных функций агрегирования и не требует подзапроса:

select (count(distinct id) -
        count(distinct case when key = 'step0' then id end)
       )
from mytable;
1 голос
/ 02 июля 2019

Попробуйте использовать коррелированный подзапрос с несуществующим

select count(distinct ID)
from tablename a 
   where not exists (select 1 from tablename b where a.id=b.id and key = 'step0')
0 голосов
/ 02 июля 2019

Это должно работать:

SELECT COUNT(COUNT(DISTINCT id)) num_ids
FROM   your_table
GROUP BY id
HAVING MIN(CASE WHEN key = 'step0' THEN key END) IS NULL;

Внешний COUNT применяется ко всему запросу, включая агрегацию COUNT(DISTINCT id) - удалите его, и вы увидите три строки со значением 1.

0 голосов
/ 02 июля 2019

Используйте группировку с пунктом

select sum(count(distinct ID)) as "Count"
  from myTable
 group by ID
 having sum(case when key = 'step0' then 1 else 0 end)=0;
-- or "having sum( decode(key,'step0',1,0) ) = 0" is also possible specific to Oracle

Count
-----
  3

например. использовать обратную логику, исходить из key = 'step0'

Демо

0 голосов
/ 02 июля 2019

использовать отличные

select COUNT (distinct ID)
FROM myTable
WHERE ID not in ( select id from myTable where key = 'step0' and id is not null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...