【问题标题】:How can I include records based on when they first appear, and exclude other records based on a certain date?如何根据首次出现的时间包含记录,并根据特定日期排除其他记录?
【发布时间】:2017-12-08 15:55:36
【问题描述】:

我需要根据相同属性和不同日期的包含和排除来选择标准,我很难思考如何做到这一点。这是我的标准列表。

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

  2. 记录没有状态码7

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

    员工 ID 上的联接涉及 2 个表。

表 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 不是正确的值之一。任何人都知道如何解决这个问题?提前致谢。

edit:这是尝试的查询。它似乎返回了一切。

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'  
;

【问题讨论】:

  • 您只是说第二个查询中存在记录的位置,如果它返回单行,它将返回第一部分的所有内容。您需要为 secondtable.id = a.id 添加一个子句,以强制它通过第一个返回的 id 过滤第二部分
  • 如果您的问题得到了回答,您应该将其标记为这样,以帮助其他人找到解决方案。

标签: sql database oracle


【解决方案1】:

试试这个:

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');

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多