2017-05-12 1 views
0

J'ai deux tables liées les unes aux autres [t1] & [t2] avec deux colonnes: [id] & [date]. J'espère récupérer le [id] et [date] de [t1] où aucun [t2]. [Date] tombe sur ou un an avant le MIN ([t1]. [Date]). Fondamentalement, excluent les [id] ayant un [t2]. [Date] (toute occurrence de date - dynamique) 'ou un an avant le premier [t1]. [Date]'. Tout [t2]. [Id] s avant un an à partir de MIN ([t1]. [Date]) est correct, et tout [t2]. [Id] s après MIN ([t1]. [Date]) est bon comme bien. Si une valeur [t2]. [Date] tombe dans la plage d'un an, cet [id] doit être exclu des données renvoyées.DATE PLAGE NON ENTRE deux dates d'une autre table

Conceptuellement Je veux quelque chose comme:

SELECT [id] 
FROM [t1] 
WHERE [t2].[date] NOT BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date] 

Mais je suis aux prises avec la façon d'aborder ce; utilisez une variable JOIN/UNION, DECLARE, une clause WHERE. Toute aide serait appréciée! Je vous remercie!

/* Adding this new information below: */ 

J'aime la réponse de Scott; Cependant, je ne pense pas avoir rendu mon «code conceptuel» suffisamment cohérent à l'origine. Je pense que je cherche quelque chose de plus comme ça, mais je retourne une erreur (Un agrégat peut ne pas apparaître dans la clause WHERE à moins qu'il ne soit dans une sous-requête contenue dans une clause HAVING ou une liste de sélection une référence externe.):

SELECT [id] 
FROM [t1] 
WHERE NOT EXISTS 
    (SELECT * FROM [t2] WHERE [t2].[date] 
    BETWEEN DATEADD(YEAR, -1, MIN([t1].[date])) AND MIN([t1].[date])) 

/* Adding this new information below: */ 

Je crois que j'ai trouvé la solution à l'enquête originale. S'il vous plaît donner un 'Arrow Up' si vous l'aimez!

SELECT DISTINCT [t1].[id] 
FROM [t1] 
WHERE NOT EXISTS (SELECT 1 
        FROM [t2] 
        WHERE [t2].[id] = [t1].[id] 
        AND [t2].[date] BETWEEN DATEADD(dd, -365, [t1].[date]) 
              AND [t1].[date]) 
+0

je vais laisser ce ici ... http: //sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do -between-and-the-devil-have-in-common.aspx –

Répondre

1

Si la date < StartDate OU date> EndDate

3

Ceci est un emploi pour PAS EXISTE!

SELECT [id] 
FROM [t1] 
WHERE NOT EXISTS (SELECT * FROM [t2] 
        WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date]) 

Mise à jour de comparer à Min (T1.Date):

Je ne suis pas aussi familier avec SQLServer - Oracle a des fonctions analytiques qui font de ce bien mor simple. Vous pouvez probablement y arriver juste en utilisant un sous-requête comme ceci:

SELECT [id] 
FROM (SELECT [id], min([date] AS minDate from [t1] GROUP BY [id]) AS t1_min 
WHERE NOT EXISTS (SELECT * FROM [t2] 
        WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1_min].[minDate]) AND [t1_min].[minDate]) 
+0

J'aime ça, mais je peux l'appliquer à une plage de dates MIN de t1 – DataMan31