Головная боль при подсчете дубликатов SQL - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть проблема, которую я не знаю, как ее преодолеть, и буду очень признателен за какое-то направление.

Пример данных

Device  Project     status
a111    101     Ready
a222    102     Finished
a333    103     Ready
a444    104     Ready
a555    105     Ready
a111    106     Started
a111    107     Ready
a555    108     Started

Я ищу способ подсчитать количество устройств в состоянии «Готов». Однако, когда дело доходит до «Готов», я хочу посчитать его только один раз И не считать, если это устройство имеет статус, отличный от «Готов» в другом проекте

Логическое Если готов в одном или нескольких проектах = считать один раз Если готов в одном, но имеет другой статус в любом другом проекте = не считается

Правильный результат должен показывать только 2 как «Готов»; «a333» и «a444».

SELECT
'Ready' AS Header
, status
, count(distinct device)
FROM my_table
WHERE
project BETWEEN'101' AND '110' 
GROUP BY status

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Я думаю, что вычитание таблицы будет хорошей техникой в ​​этом случае. Сначала выберите с использованием различных:

select distinct(device)
  from my_table
  where status= 'Ready'
Minus
select distinct(device)
  from my_table
  where status <> 'Ready'
;
0 голосов
/ 06 сентября 2018

Вы можете использовать not exists:

select t.*
from table t
where not exists (select 1 from table t1 where t1.device = t.device and t1.status <> 'Ready');
0 голосов
/ 06 сентября 2018

Вы можете использовать такой SQL Select statement с HAVING предложением:

select device  
  from tab 
 group by device
 having sum(case when status = 'Ready' then 1 else 0 end ) =  count(device);

 DEVICE
 ------
 a444
 a333
0 голосов
/ 06 сентября 2018

Если вы все устройства, чей статус готов, то в одном из подходов используются group by и having:

select device
from my_table t
group by device
having min(status) = max(status) and min(status) = 'Ready'; 
...