当两个字段满足OR条件时从表中选择。如果他们满足相同字段的AND条件,请选择具有早期日期的

时间:2017-03-29 16:43:19

标签: sql oracle select join

ID1  ID2     DATE        INITIAL   FINAL
20   328    2016/11/08    01         01
21   328    2016/11/11    01         01
53   766    2016/09/26    00         01
39   766    2016/11/25    01         00

每个ID2有两个条目

在上面的示例中,我想选择INITIAL = 01 FINAL = 01的记录,但是当INITIAL = 01 FINAL = 01时,对于相同的ID2,我想要选择具有较早日期的那个

我正在寻找一个看起来像这样的最终设置

ID1  ID2     DATE        INITIAL   FINAL
20   328    2016/11/08    01         01
53   766    2016/09/26    00         01
39   766    2016/11/25    01         00

3 个答案:

答案 0 :(得分:0)

在此示例中,“OR”包括“AND”

试试吧

?&

答案 1 :(得分:0)

将您的2个案例视为单独的查询,然后将它们联合起来。 WITH只是我构建虚拟数据。这不会解决id2具有01 initial和01 final的情况,而另一行具有00和01 ---但这不符合您的要求。如果同一个id2的两个01 01行具有相同的最小日期,它也不会解决这个问题,但是再次 - 这不在规范中;我只是想说明那些事情是彻底的。

library(data.table) 
setDT(Test_File)[, {
           v1 <- sub("\\d+", "", Product)
           v2 <- sub("\\D+", "", Product)
         .(Duplicate = any(v1=="E") & uniqueN(v1)>1 & anyDuplicated(v2)>0)} , Order]
#     Order Duplicate
#1:     1     FALSE
#2:     2      TRUE
#3:     3     FALSE
#4:     4     FALSE
#5:     5     FALSE

答案 2 :(得分:0)

尝试使用以下查询。 它将丢弃INITIAL = 00和FINAL = 00的行,因为您只想选择INITIAL = 01或FINAL = 01 AND INITIAL = 01 AND FINAL = 01且早期日期的记录

SELECT ID1,ID2,DATE,INITIAL,FINAL FROM TEST1 WHERE ID1 NOT IN(SELECT ID1 FROM
(SELECT ID1,
  ID2,
  DATE,
  INITIAL,
  FINAL,
  RANK() OVER (PARTITION BY ID2 ORDER BY DATE) rn
FROM TEST1
WHERE (INITIAL = '01'
AND FINAL    = '01')
) WHERE rn>1  ) AND (INITIAL != '00'OR FINAL!= '00');