我是sqlplus的新手,对此主题的知识非常有限,有人可以在这方面帮助我吗?
我有一个表,其中包含列:代码,值和日期
在代码列中有两种类型的值,例如:ABC.1和DEF.1。这里DEF.1具有所有日期的值,但ABC.1却不是这样,它缺少某些日期的值。我正在尝试编写查询以提取数据,如果DEF.1中有特定日期的值,而ABC.1中没有该日期的值。
例如:
+------------------------------+
| Code Value Date |
+------------------------------+
| DEF.1 44 22-11-2019 |
+------------------------------+
| ABC.1 23 23-11-2019 |
+------------------------------+
| DEF.1 12 23-11-2019 |
+------------------------------+
| ABC.1 99 24-11-2019 |
+------------------------------+
| DEF.1 23 24-11-2019 |
+------------------------------+
此处ABC.1没有日期为22-11-2019的值,因此对于该日期,我想提取DEF.1的值
答案 0 :(得分:1)
最简单而且可能最快的是分析count
:
select code, value, date_
from (
select code, value, date_,
count(case code when 'ABC.1' then 1 end) over (partition by date_) c1,
count(case code when 'DEF.1' then 1 end) over (partition by date_) c2
from tbl t)
where c1 <> c2
您还可以使用not exists
,not in
进行分组,但是如果您想了解详细信息,则分析方法最短。该查询显示count
不同的所有行,因此,如果有3 ABC
和5 DEF
,则该日期将获得8行。如果缺少行,它也可以工作,例如您的示例。 Date
是保留字,所以我加了下划线。
答案 1 :(得分:0)
我将使用not exists
处理这个问题:
select t.*
from t
where t.code = 'DEF.1' and
not exists (select 1
from t t2
where t2.date = t.date and t2.code = 'ABC.1'
);
使用(date, code)
上的索引,我希望它具有非常好的性能。