在Oracle中的两个字段中消除重复选择

时间:2017-07-05 19:14:23

标签: oracle

我有一个表,我正在使用同一个表进行内部联接。这是表结构

Acct#|Name |Med_Rec|Admit Date
-----|-----|-------|----------
   1 |MIKE |100    |7/1/2017
   2 |MIKE |100    |7/2/2017
   3 |MIKE |100    |7/3/2017
   4 |CHRIS|101    |5/5/2017
   5 |CHRIS|101    |5/7/2017

我的目标是在连续3天内获得录取日期的帐户(即迈克在2017年7月1日首先录取,然后第二天再次录取,也是第二天录取)。我的目标结果应该是这样的

Acct|Name |Admit_Date|Othr_Acct|Admit_Date
----|-----|----------|---------|-----------
   1|MIKE |7/1/2017  |    2    |7/2/2017
   1|MIKE |7/1/2017  |    3    |7/3/2017
   4|CHRIS|5/5/2017  |    5    |5/7/2017

我面临的问题是我收到的查询结果再次选择了帐号。它不应再出现,因为我已在“Othr_Acct”

下列出它
Acct|Name |Admit_Date|Othr_Acct|Admit_Date
----|-----|----------|---------|-----------
   1|MIKE |7/1/2017  |    2    |7/2/2017
   1|MIKE |7/1/2017  |    3    |7/3/2017
   2|MIKE |7/2/2017  |    3    |7/3/2017<-wrong it was already selected
   4|CHRIS|5/5/2017  |    5    |5/7/2017


SELECT 
A.Acct
A.Name 
A.Admit_Date
B.Acct AS Othr_Acct
B.Admit_Date

FROM 
A.TABLE
B.TABLE

WHERE 

A.Med_Rec=B.Med_Rec
AND B.Admit_Date-A.Admit_Date BETWEEN 0 AND 2
AND A.Acct<>B.Acct

1 个答案:

答案 0 :(得分:0)

仅将表B连接到表A的第一行。
使用子查询和row_number函数对A

中的行进行编号
SELECT 
    A.Acct,
    A.Name ,
    A.Admit_Date,
    B.Acct AS Othr_Acct,
    B.Admit_Date
FROM (
   SELECT t.*, 
    row_number() over (partition by Med_Rec order by Admit_Date) As rn
   FROM TABLE1 t
) a
JOIN TABLE1 b
ON A.rn = 1 AND A.Med_Rec=B.Med_Rec
AND B.Admit_Date-A.Admit_Date BETWEEN 0 AND 2
AND A.Acct<>B.Acct