Wählen Sie die Zeile aus, in der alle datasätze mit ähnlicher Zeile die Bedingung erfüllen

Ich habe einen Tisch mit vielen Platten, aber zum Beispiel ..

ID | USER ID | DATE 1 | 1 | 2014-05-26 2 | 1 | 2015-05-08 3 | 2 | 2014-05-20 

Ich versuche, USER_ID für datasätze auszuwählen, deren date mehr als 6 Monate verstrichen ist, aber sie nicht einschließen, wenn es einen anderen datasatz mit demselben USER_ID gibt, der diese Kriterien nicht erfüllt. Also zum Beispiel möchte ich nur den Rekord mit User ID 2 zurückgeben.

Mein Problem kann ich tun

 SELECT USER_ID FROM TABLE WHERE DATEDIFF(month, DATE, GETDATE()) > 6 

aber das wird immer noch einen Rekord mit USER_ID 1 zurückgeben. Ich bin mir sicher, dass das super einfach ist, aber ich habe es nicht geschafft, Fortschritte zu machen.

Nehmen Sie einfach Ihre Aussage und nehmen Sie den anderen weg:

  WITH UsersWithYoungerDates AS ( SELECT USER_ID FROM TABLE WHERE DATEDIFF(month, DATE, GETDATE()) <= 6 ) SELECT USER_ID FROM TABLE WHERE DATEDIFF(month, DATE, GETDATE()) > 6 AND USER_ID NOT IN(SELECT USER_ID FROM UsersWithYoungerDates) 

Sie können die folgende Abfrage verwenden:

 SELECT USER_ID FROM mytable GROUP BY USER_ID HAVING COUNT(CASE WHEN DATEDIFF(month, [DATE], GETDATE()) <= 6 THEN 1 END) = 0 

Das oben genannte schließt jede USER_ID s aus, die mindestens eine Zeile hat, deren DATE 6 oder weniger als 6 Monate alt ist.

Demo hier

Wenn du alle Felder auswählen willst, dann kannst du eine windowsversion von bedingtem COUNT wie:

 SELECT * FROM ( SELECT *, COUNT(CASE WHEN DATEDIFF(month, [DATE], GETDATE()) <= 6 THEN 1 END) OVER (PARTITION BY USER_ID) AS cnt FROM mytable ) t WHERE cnt = 0 

Demo hier

oder alternativ NOT EXISTS :

 SELECT * FROM mytable AS t1 WHERE NOT EXISTS (SELECT 1 FROM mytable AS t2 WHERE t1.USER_ID = t2.USER_ID AND DATEDIFF(month, t2.[DATE], GETDATE()) <= 6) 

Demo hier

 SELECT USER_ID FROM [TABLE] WHERE DATEDIFF(month, DATE, GETDATE()) > 6 and USER_ID not in ( select USER_ID from [TABLE] where 6 <= datediff(month, date, getdate()) ); 

Beachten Sie, dass dies auf 7 Monate oder mehr , nicht "mehr als 6 Monate" filtern wird. DATEDIFF runden ab. Vielleicht möchten Sie diesen Aspekt Ihres ursprünglichen Plans neu gestalten.

Auch das TABLE du wahrscheinlich, aber TABLE ist ein reserviertes Wort, also wenn es nicht nur ein (fehlgeleiteter: p) Platzhalter wäre, müsste es Kennzeichnungsbegrenzer brauchen.

So was?

 SELECT USER_ID FROM TABLE WHERE DATEDIFF( month, DATE, GETDATE()) > 6 AND USER_ID NOT IN ( SELECT USER_ID FROM TABLE WHERE DATEDIFF( month, DATE, GETDATE()) <= 6 )