2012-05-02 13 views
1

我有一个ID列表,每个ID都有一个代码和一个日期。每个ID可以有多个代码和日期。我需要找到仅包含代码X和代码Y(代码((X,Y))的ID以及早于540天前的日期(Date <= DATEADD(dd, -540, CURRENT_TIMESTAMP))排除X存在时

由于一个ID可以有多个代码和日期,我需要排除那些不符合我上述标准的ID。下面是一个例子。

ID Code Date 

    5525 X 2010-10-07 
    5525 Y 2010-11-25 
    5525 Y 2010-11-29 
    5525 Y 2010-10-06 
**5525 X 2011-01-14** 
**5525 X 2011-01-31** 
    5525 Y 2010-12-09 
    5525 Y 2010-10-15 
    5525 X 2010-10-18 
    5525 Y 2010-12-08 
    5525 X 2010-12-09 

由于两个突出的ID必须大于-540天前,我需要排除所有的ID,即使它符合我原来的标准的日期。

我需要包含符合我的标准(code in (X,Y) and Date <= DATEADD(dd, -540, CURRENT_TIMESTAMP))的ID,但如果另一个具有相同值的ID不符合此条件,则不适用。

select ID from table 
where code in (X,Y) 
and date <= DATEADD(dd, -540, CURRENT_TIMESTAMP) 
+0

你在使用一个数据库? – Exupery

+0

对不起,SQL Server 2012 – user1370407

+1

谢谢,为了将来的参考,包括正在使用的技术的标记是非常有用的。 – Exupery

回答

0

与子查询一起使用NOT IN子句:

SELECT * 
FROM table1 
WHERE id NOT IN (
    SELECT id 
    FROM table1 
    WHERE Date <= DATEADD(dd, -540, CURRENT_TIMESTAMP)  
) 
AND code in ('X','Y') 

这是否帮助?

P.S.如果在整个表格中不唯一,则称它为“反标准”ID。我承认这让我有点困惑。

+1

非常感谢您的帮助。我使用“ID”来模糊我的数据。我为这个混乱道歉,这是我在这个网站上的第一篇文章,我是一个新手。感谢您的时间。我现在要测试这个.... – user1370407

+0

SELECT * FROM 表1 WHERE ID IN(SELECT ID FROM表1 WHERE 日期<= DATEADD(DD,-540,CURRENT_TIMESTAMP) 和代码中( 'X' , 'Y') ) 和ID NOT IN(SELECT ID FROM表1 WHERE日期> DATEADD(DD,-540,CURRENT_TIMESTAMP) 和代码在( 'X', 'Y') ) 和日期!='0001-01-01' 谢谢你的帮助! – user1370407

+0

@ user1370407太棒了!现在,请将我的答案标记为有用或正确。 –

0

为了检查给定的ID是否满足所有实例的条件,请使用与您的条件相反的WHERE NOT EXISTS。像这样:

SELECT ID, Code, [Date] 
FROM tablename t 
WHERE NOT EXISTS (
    SELECT * 
    FROM tablename 
    WHERE ID = t.ID AND NOT (
     Code IN ('X','Y') 
     AND [Date] <= DATEADD(dd, -540, CURRENT_TIMESTAMP)) 
) 
1

我猜你是这样的事情后:

SELECT t1.ID FROM table_x t1 
WHERE 
    t1.Date <= DATEADD(dd, -540, CURRENT_TIMESTAMP) AND 
    -- you can add other criterias here as well, like t1.Code in (X,Y) 
    t1.ID NOT IN (
     SELECT ID FROM table_x t2 
     WHERE 
      t2.Date > DATEADD(dd, -540, CURRENT_TIMESTAMP) 
      -- you can add other criterias here as well, like t2.Code in (Z,F) 
    );