Как подсчитать как нулевые значения, так и отдельные значения ненулевых столбцов в таблице

У меня есть то, что, по моему мнению, должно быть простым запросом, но, возможно, это не так. Мне нужно сделать две вещи в одном запросе (желательно):

  1. Подсчитайте количество записей (в нескольких столбцах), где значение равно ПУСТО (NULL)
  2. Подсчитайте # различных записей в определенном столбце

По сути, таблица представляет собой список данных о претензиях и организована следующим образом ...

  1. Номер претензии может встречаться несколько раз. Я хотел бы подсчитать отдельные номера претензий (это поле никогда не будет NULL)
  2. Значения NULL могут встречаться в одном или нескольких столбцах

Образец данных:

insert into t1 (ID, LOB, Funding, Claim_ID, Claim_Type, Pharmacy_ID)
values (3617623, 'DRUG', NULL, 2389753478, 'ORG', 'OA734'),
(3462090, 'DRUG', NULL, 2389753478, 'REV', 'OA734'), 
(3587262, NULL, NULL, 5356201834, 'ORG', NULL), 
(3160932, 'DRUG', NULL, 4627282840, 'ORG', NULL), 
(3986523, 'DRUG', NULL, 4627282840, 'REV', NULL), 
(3874627, 'DRUG', NULL, 7735624780, 'ORG', '43857')

Ожидаемый результат:

  1. Общее количество записей = 6
  2. Количество Claim_ID = 4
  3. Количество NULL LOB = 1
  4. Количество НУЛЕВОГО финансирования = 4
  5. Счетчик NULL Claim_Type = 0
  6. Количество NULL Pharmacy_ID = 2

Я пробовал с этим запросом, но он не совсем работает:

select
sum (case when LOB is null then 1 else 0 end) as LOB_null,
sum (case when Funding is null then 1 else 0 end) as Funding_null,
sum (case when Claim_Type is null then 1 else 0 end) as Claim_Type_null,
sum (case when Pharmacy_ID is null then 1 else 0 end) as Pharmacy_ID_null,
sum (count (distinct (case when claim_id is not null then 1 end)) as ttl_claims,
sum (case when ID is not null then 1 end) as ttl_recs
from t1

person Gar    schedule 31.10.2017    source источник


Ответы (1)


вам нужно подсчитать различные claim_id для строк, которые удовлетворяют указанным условиям, вместо подсчета записей:

select
sum (case when ID is not null then 1 end) as ttl_recs,
count (distinct case when claim_id is not null then claim_id end) as ttl_claims,
count (distinct case when LOB is null then claim_id end) as LOB_null,
count (distinct case when Funding is null then claim_id end) as Funding_null,
count (distinct case when Claim_Type is null then claim_id end) as Claim_Type_null,
count (distinct case when Pharmacy_ID is null then claim_id end) as Pharmacy_ID_null
from t1

и если есть какие-либо изменения, тот же claim_id может иметь 2 строки с атрибутом NULL в одной строке и NOT NULL в другой, вы должны сначала сгруппировать по claim_id, чтобы разрешить конфликты, как вы хотите, а затем создать сводку этого агрегата

person AlexYes    schedule 31.10.2017
comment
THNXS так много @AlexYes за ваш ответ! Ваша модификация моей попытки решения моей проблемы работает! Однако я думаю, что мне нужно будет найти способ сделать решение более эффективным. В настоящее время требуется 4 минуты 58 секунд для запуска против 26 957 022 рекордов. - person Gar; 01.11.2017
comment
@Gar, ваша таблица сортируется / распределяется по claim_id? - person AlexYes; 01.11.2017
comment
Извините за поздний ответ. Таблица находится в Redshift от Amazon, и я все еще изучаю особенности этой базы данных. Но, отвечая на ваш вопрос, я не совсем уверен. Я хотел бы думать, что столбцы ID и Claim_ID являются ключами в таблице, но я просто попытался запустить команду pg_table_def и ничего не получил - person Gar; 01.11.2017
comment
лучше воссоздать таблицу с SORTKEY (claim_id) в конце, вставить данные и запустить VACUUM и ANALYZE, а затем проверить, как работает запрос. Sortkey гарантирует, что строки с одинаковым claim_id будут вместе на диске, поэтому подсчет будет более эффективным. - person AlexYes; 01.11.2017
comment
имеет смысл; Я подниму его с помощью нашего dba и посмотрю, что он скажет - person Gar; 01.11.2017