[英]Join two tables on a condition of ID and a date from first table is between two other dates in another table
[英]DATE RANGE NOT BETWEEN two dates from another table
我有两个彼此相关的表[t1]和[t2],两列:[id]和[date]。 我希望从[t1]中没有[t2]。[date]属于MIN([t1]。[date])或一年之前的[t1]中检索[id]和[date]。
基本上排除最早在[t1]。[date]之前或一年前具有[t2]。[date](任何日期出现-动态)的[id]。 距MIN([t1]。[date])一年后的任何[t2]。[id] s都可以,而距MIN([t1]。[date])的任何[t2]。[id] s都可以。好。 如果[t2]。[date]值在一年范围内,则应从返回的数据中排除该[id]。
从概念上讲,我想要这样的东西:
SELECT [id]
FROM [t1]
WHERE [t2].[date] NOT BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date]
但是我在努力解决这个问题。 使用JOIN / UNION,DECLARE变量,WHERE子句。 任何帮助,将不胜感激! 谢谢!
/* Adding this new information below: */
我喜欢斯科特的回应; 但是,我认为我本来的“概念代码”不够统一。 我想我正在寻找类似的东西,但是我返回一个错误(除非聚集在HAVING子句或选择列表中包含的子查询中,否则聚集可能不会出现在WHERE子句中,并且聚集的列是外部参考。):
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: */
我相信我已经找到了原始查询的解决方案。 如果您喜欢,请给它一个“ Arrow Up”!
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])
这是不存在的工作!
SELECT [id]
FROM [t1]
WHERE NOT EXISTS (SELECT * FROM [t2]
WHERE [t2].[date] BETWEEN DATEADD(YEAR, -1, [t1].[date]) AND [t1].[date])
更新以与Min(T1.Date)比较:
我对Sqlserver不太熟悉-oracle具有Analytic函数,这些函数使此操作更为简单。 您可以仅使用子查询来完成此操作,如下所示:
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])
日期<开始日期或日期>结束日期
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.