подсчитывать строки из одной таблицы на основе нескольких условий, используя SQL - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь достичь того, что кажется простым, но я не могу этого понять. У меня есть таблица test_score ..

----------------------
ID   | Date | Score
---------------------
345 | dt1  | 80
346 | dt1  | NULL
347 | dt1  | NULL
345 | dt1  | NULL
348 | dt2  | 75

В таблице может быть несколько записей с парой ID_Date .. например, для ID 345 и dt1 есть две записи, одна с оценкой, а другая NULL значение. Я хочу получить ТОЛЬКО те строки, которые имеют значения NULL.

В этом примере возвращать строки с идентификаторами 346 и 347 .. Это ДОЛЖНА быть пара ID_Date, и оба они имеют значения NON-NULL

Мои попытки на данный момент: Выбрать строки, для которых оценка равна NULL, ID и дата не равны NULL. INTERSECT выбрать строки, для которых оценка NOT NULL, а ID и Date НЕ NULL. Это дает мне количество строк, в которых эти пары id_date существуют в ОБЕИХ условиях score_is_null и score_is_not_null. Я вычитаю это из общего количества строк, в которых оценка равна NULL ... но мои результаты неверны.

Второй подход.

SELECT id || date AS temp, count(*)
FROM test_score
WHERE score IS NULL AND id IS NOT NULL AND date IS NOT NULL
AND pairs NOT IN 
(SELECT id || date AS temp
FROM test_Score 
WHERE score IS NOT NULL AND id IS NOT NULL AND date IS NOT NULL)

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Один простой метод:

Select ids, dt, score from (Select t.*, max(score) OVER (PARTITION BY ids, dt) mx from tab1 t)
where mx IS NULL

Другой метод:

Select ids, dt, score from (Select t.*, count(ids) OVER (PARTITION BY ids, dt) mx from tab1 t)
where mx = 1 and score is NULL;
0 голосов
/ 14 июля 2020

Если вам нужны только пары, используйте агрегацию:

select id, date
from test_score
group by id, date
having max(score) is null;

Если по какой-то причине вам действительно нужны исходные строки, используйте not exists:

select ts.*
from test_score ts
where not exists (select 1
                  from test_score ts2
                  where ts2.id = ts.id and ts2.date = ts.date and ts2.score is not null
                 );

Для повышения производительности , вам нужен индекс для (id, date, score).

...