如何根据首次出现的记录包含记录,并根据特定日期排除其他记录?

时间:2017-12-08 15:55:37

标签: sql database oracle

我需要根据相同属性和不同日期的内容和排除选择标准,我很难绕过如何做到这一点。这是我的标准列表。

  1. 首先将记录添加到数据库中,事务处理为222或223,活动代码为“A”。

  2. 记录的状态代码不是7

  3. 结果中不应包含2009年10月1日之后的以下交易(109,154,982,745)的最新活动代码(A,V,W,J)的任何记录,< / p>

    有两个表涉及员工ID的加入。

  4. 表1:

    |id  |  statcode
    |  1     |  1
    |  2     |  3
    |  3     |  7
    |  4     |  2
    

    表2:

    |id       |  date      | act_code   |  trans 
    |   1     |  1/1/17    |   Z        |    109
    |   1     |  3/4/12    |   A        |    222
    |   1     |  2/14/09   |   A        |    154
    |   2     |  1/1/17    |   A        |    223
    |   2     |  6/6/13    |   V        |    109
    |   3     |  11/23/14  |   A        |    222
    |   4     |  12/13/16  |   X        |    154
    |   4     |  11/23/14  |   W        |    223
    

    我想回来的是:

    |    id  | statcode|  date      | act_code   |  trans 
    |   1    |   1     |  3/4/12    |   A        |    222
    

    不会选择ID 2,因为第一个trans不是正确的值之一。由于状态代码不正确,因此不会包含ID 3。不会选择ID 4,因为最新的act_code不是正确的值之一。任何人都知道如何解决这个问题?提前谢谢。

    编辑:这是尝试的查询。它似乎归还了一切。

    SELECT *
    FROM firsttable a
    join secondtable b on a.id=b.id
    where exists (select id, min(date) from
    secondtable 
    where c.TRANS in ('222','223') and (TRANS NOT IN ('109', '154', '982', 
    '745')
    AND ACT_CODE NOT IN  ('A', 'V', 'W', 'J') and date>= to_date('10/01/2009', 
    'MM/DD/YYYY'))
    group by id)
    and a.statcode <> '07'  
    ;
    

2 个答案:

答案 0 :(得分:0)

试试这个:

select Emp_id,statcode,date,act_code,trans
from table1 A join table2 b on (a.id=b.id) 
WHERE b.trans in(222,223)
AND b.act_code='A'
AND a.stat_code<>7
AND (SELECT NVL(max(date),TO_DATE('01-JAN-1990','DD-MON-YYYY'))
       FROM table2 c 
       WHERE c.id=b.id
         AND c.act_code in ('A', 'V', 'W', 'J')
         AND c.trans IN (109, 154, 982, 745)) <  TO_DATE('01-OCT-1990','DD-MON-YYYY');

答案 1 :(得分:0)

*更新:现已测试并正常工作。

SELECT * FROM
tbl1 a INNER JOIN tbl2 b on a.id = b.id
where b.trans IN (222,223) 
AND a.statcode <> 7
AND b.act_code = 'A'
AND NOT EXISTS(
SELECT 1 from tbl2 t2
    WHERE t2.id = a.id 
    AND t2.act_code IN ('A','V','W','J')
    AND t2.trans IN (109,154,982,745)
    AND t2."date" > to_date('10/01/2009', 'MM/DD/YY'));
GO
相关问题