Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免oracle数据库中的重复值_Oracle - Fatal编程技术网

避免oracle数据库中的重复值

避免oracle数据库中的重复值,oracle,Oracle,我正在处理employee表,其中一名员工在一天内登录和注销。这些登录和注销都是用一些代码捕获的,比如“I”和“O”。在我们的数据库中,员工可以在注销前多次登录,反之亦然。 示例数据如下所示。我在样本数据中保留了一些空间,以便对数据有一些了解 样本数据: empid终端prd cdts唯一\u id logflag 10025系统1 C 20140129025854CS 66D47E9841E1C149947A8D28B32BFF98 I 10025系统1 C 20140129031601CS

我正在处理employee表,其中一名员工在一天内登录和注销。这些登录和注销都是用一些代码捕获的,比如“I”和“O”。在我们的数据库中,员工可以在注销前多次登录,反之亦然。 示例数据如下所示。我在样本数据中保留了一些空间,以便对数据有一些了解

样本数据: empid终端prd cdts唯一\u id logflag 10025系统1 C 20140129025854CS 66D47E9841E1C149947A8D28B32BFF98 I 10025系统1 C 20140129031601CS 85268C4FF5523D4882DE492C0716F79 O 10025系统1 C 20140129031849CS 501F181C0138C041B25F4BAFFC4FE9B4 I 10025系统1 C 20140129035014CS 209CF069D0A3A2428715018DAB6EC431 I

10025系统2 C 20140129035214CS 1248A63B50B1C244A8F21D9FD337F839 I 10025系统2 C 20140129040748CS 9A15F65724F0C04B93B42252BB3C50E3 O 10025系统2 C 20140129041636CS 41FB8A9D48B5C4489A4BC95F343613C O

10025系统2 D 20140129044217CS 917054DE757CAC40A97A3E714BEA9CD1 I 10025系统2 D 20140129035214CS 1248A63B50B1C244A8F21D9FD337F839 O 10025系统2 D 20140129040748CS 9A15F65724F0C04B93B42252BB3C50E3 O 10025系统2 D 20140129041636CS 41FB8A9D48B5C4489A4BC95F343613C I

10025系统2 D 20140129044217CS 917054DE757CAC40A97A3E714BEA9CD1 O 预期成果: empid终端prd cdts唯一\u id logflag 10025系统1 C 20140129025854CS 66D47E9841E1C149947A8D28B32BFF98 I 10025系统1 C 20140129031601CS 85268C4FF5523D4882DE492C0716F79 O 10025系统1 C 20140129031849CS 501F181C0138C041B25F4BAFFC4FE9B4 I

10025系统2 C 20140129035214CS 1248A63B50B1C244A8F21D9FD337F839 I 10025系统2 C 20140129040748CS 9A15F65724F0C04B93B42252BB3C50E3 O

10025系统2 D 20140129044217CS 917054DE757CAC40A97A3E714BEA9CD1 I 10025系统2 D 20140129035214CS 1248A63B50B1C244A8F21D9FD337F839 O 10025系统2 D 20140129041636CS 41FB8A9D48B5C4489A4BC95F343613C I 10025系统2 D 20140129044217CS 917054DE757CAC40A97A3E714BEA9CD1 O 像怀斯一样,我有数百万张唱片。我的任务是为每个员工捕获序列中的第一次登录和第一次注销。对于上面的例子,我应该得到4条记录作为结果集,提到他的登录和注销

这里的前3列empid、terminal、prd需要参与分区。换句话说,员工进入终端并使用不同的prd。所以我想捕捉每个员工第一次登录和第一次注销到每个系统和使用每个prd

我怎样才能做到这一点。我完全被封锁了。请帮助使用滞后:

SELECT cdts,
       empid,
       logflag,
       unique_id
FROM   (
  SELECT t.*,
         ROW_NUMBER() OVER ( PARTITION BY empid, logflag, group_id ORDER BY cdts ) AS rn
  FROM   (
    SELECT t.*
           ROW_NUMBER() OVER ( PARTITION BY empid ORDER BY cdts )
             - ROW_NUMBER() OVER ( PARTITION BY empid, logflag ORDER BY cdts )
             AS group_id
    FROM   your_table t
  ) t
)
WHERE  rn = 1;

非常感谢您的指导。最后,我可以通过这个查询得到想要的结果

select CDTS,empid,cterm,prd,logflag,unique_id,FLAG from 
(
  select CDTS,empid,cterm,prd,logflag,unique_id, case when logflag = prev_logflag then 1 else 0 end as flag from
  (
   select CDTS,empid,cterm,prd,logflag,unique_id,lag(logflag) over(partition by empid,cterm order by prd,cdts) as prev_logflag from emp 
  )T 
)T1 where flag =0

我们的数据库,一个员工在注销前可能会多次登录,真的吗?听起来很奇怪,但这种情况经常发生。有些时候,我们甚至错误地登录了2次,或者如果我们怀疑我们在第一次尝试时无法正确刷卡,请发布您的尝试和代码问题。像如何做到这一点而不显示出任何努力的问题在这里通常是不受欢迎的。数据库的哪个版本?嘿,首先非常感谢你最快的答复。我现在正在做这件事。一旦我完成了,我会发布我的反馈。我正在使用Oracle 12c
select CDTS,empid,cterm,prd,logflag,unique_id,FLAG from 
(
  select CDTS,empid,cterm,prd,logflag,unique_id, case when logflag = prev_logflag then 1 else 0 end as flag from
  (
   select CDTS,empid,cterm,prd,logflag,unique_id,lag(logflag) over(partition by empid,cterm order by prd,cdts) as prev_logflag from emp 
  )T 
)T1 where flag =0