Sql 如何通过ORACLE选择唯一记录
当我从表中执行SELECT*时,我得到如下结果:Sql 如何通过ORACLE选择唯一记录,sql,oracle,Sql,Oracle,当我从表中执行SELECT*时,我得到如下结果: ID Date Time Type ---------------------------------- 60 03/03/2013 8:55:00 AM 1 60 03/03/2013 2:10:00 PM 2 110 17/
ID Date Time Type
----------------------------------
60 03/03/2013 8:55:00 AM 1
60 03/03/2013 2:10:00 PM 2
110 17/03/2013 9:15:00 AM 1
67 24/03/2013 9:00:00 AM 1
67 24/03/2013 3:05:00 PM 2
如您所见,每个ID在同一日期都有一个事务类型1和2
但ID 110只有类型1
那么,我怎样才能得到这样的结果:
ID Date Time Type
----------------------------------
110 17/03/2013 9:15:00 AM 1
由于第一个结果只返回一条记录,您可以使用:
select * from my_table t
where exists (
select 1 from my_table
where id = t.id
group by id
having count(*) = 1
)
根据需要按id、日期更改分区定义分区
select *
from (select t.*
,count(*) over (partition by id,date) as cnt
from mytable t
) t
where t.cnt = 1
;
如果只需要类型1,请比较最小值和最大值。我更喜欢窗口功能:
select t.*
from (select t.*, min(type) over (partition by id) as mintype,
max(type) over (partition by id) as maxtype
from t
) t
where mintype = maxtype and mintype = 1;
如果您只需要相同类型的记录,而不是特定类型=1的记录,请删除该条件
如果您只希望记录在同一天,那么将日期包含在分区中
在某些情况下,不存在可能更快:
select t.*
from t
where not exists (select 1 from t t2 where t2.id = t.id and t2.type <> 1);
是否可以假设,如果特定ID只有一个记录,则该记录将为类型1?是否可以为特定ID和日期有多个事务,所有事务都具有相同的类型?例如,ID=110是否可以在同一日期有两个类型为1的事务?如果可能的话,预期的结果是什么?注意:类似的情况是可能的,例如,如果Type=1表示登录,Type=2表示注销,则有人可以再次登录。因此,我的问题的答案取决于您的应用程序。这会检查是否有一条记录,但不会说明类型。@GordonLinoff,答案由问题定义。我不想猜测实际数据是什么。不存在不会更快。这些分析功能不需要排序。空类型的记录呢?您的两个查询都无法检测到它…:-当每个id有许多行时,not exists应该使用适当的索引更快。@DuduMarkovitz。OP显式声明,正如您看到的,每个ID都有一个事务类型1和2。我认为这意味着类型只有这些值。OP并没有声明给定类型的每个id只有一行。OP说关于数据样本。正如我所说的,我不太喜欢猜猜我的真实数据是什么样子的游戏。