2012-05-02 1 views
1

У меня есть список идентификаторов, у каждого идентификатора есть код и дата. Для каждого идентификатора может быть несколько кодов и дат. Мне нужно найти идентификаторы, которые включают только код X и код Y (код в (X, Y)), а также дату старше 540 дней назад (Date <= DATEADD(dd, -540, CURRENT_TIMESTAMP)).Исключая, когда существует X

Поскольку идентификатор может иметь несколько кодов и дат, мне нужно исключить те идентификаторы, которые не соответствуют моим критериям выше. Ниже приведен пример этого.

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 

Поскольку два выделены идентификаторы имеют дату, которая больше, чем -540 дней назад мне нужно исключить все идентификаторы, даже если она соответствует моим первоначальным критериям.

Мне нужно включить идентификаторы, соответствующие моим критериям (code in (X,Y) and Date <= DATEADD(dd, -540, CURRENT_TIMESTAMP)), но если другой идентификатор того же значения не соответствует этим критериям.

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 table1 WHERE ID IN ( ВЫБРАТЬ ID FROM table1 WHERE Дата <= DATEADD (дд, -540, CURRENT_TIMESTAMP) И код в ('X' , 'Y') ) и идентификатор НЕ в (ВЫБРАТЬ ID ИЗ table1 ГДЕ Дата> DATEADD (дд, -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) 
    ); 

 Смежные вопросы

  • Нет связанных вопросов^_^