使用SQL基于多个条件对单个表中的行进行计数



我正在努力实现看似简单的目标,但我无法实现。我有一张桌子,testrongcore。。

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

该表可以有多个具有ID_Date对的条目。。例如,对于ID345和dt1,有两个条目,一个具有分数,另一个具有NULL值。我只想获取那些具有NULL值的行。

在本例中,返回ID为346和347的行。它必须是ID_Date对,并且这两个都是NON-NULL值

到目前为止我的尝试:选择分数为NULL、ID和日期不为NULL的行INTERSECT选择分数为not NULL、ID与日期不为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)

有什么建议吗?

如果您只想要对,那么使用聚合:

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)上的索引。

一个简单的方法是:

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;

相关内容

  • 没有找到相关文章

最新更新