Sql 如何通过ORACLE选择唯一记录

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/

当我从表中执行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/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说关于数据样本。正如我所说的,我不太喜欢猜猜我的真实数据是什么样子的游戏。