0

我试图弄清楚如何在 where 子句中使用声明的变量来帮助设置某些过滤器。

这个想法是根据指定的事件日期在某些日期之间提取数据,但我想从结果中过滤掉以前的事件日期。

因此,例如,如果我有 4 个事件日期,并且我想提取该事件​​日期之前的一周数据(不包括以前的事件日期),我将有这样的代码(注意 where 子句不正确,但这就是想法我正在寻找的东西):

前任:

/* 
Event Dates:
2021-07-20
2021-08-02
2021-08-04
2021-08-05
*/


DECLARE @event_date DATE = '2021-08-04', @start_date DATE, @end_date DATE 

if @event_date  = '2021-07-20' BEGIN SET @start_date = '2021-07-15' SET @end_date = '2021-07-20' END
else if @event_date = '2021-08-02' BEGIN SET @start_date = '2021-07-28' SET @end_date = '2021-08-02' END
else if @event_date = '2021-08-04' BEGIN SET @start_date = '2021-07-30' SET @end_date = '2021-08-04' END
else if @event_date = '2021-08-05' BEGIN SET @start_date = '2021-07-31' SET @end_date = '2021-08-05' END

SELECT acct_num, dt, var1, var2, var3, var4, var5 /*dt column is the date*/
FROM TEST_DB 
WHERE dt BETWEEN @start_date AND @end_date 
AND (CASE -- This is basically what I'm trying to accomplish, not sure how though
    WHEN @event_date = '2021-08-04' THEN dt!= '2021-08-02'
    WHEN @event_date = '2021-08-05' THEN dt not in ('2021-08-02', '2021-08-04')
END as whatever) 
AND acct_num = 1234

因此,理想情况下,当提取与先前事件日期重叠的日期范围时 - 这些事件日期会从结果中排除。我在 SO 上找到了许多其他帖子,但似乎没有什么能真正回答这个具体问题。

帮助表示赞赏!

编辑澄清:这就是数据库的样子。Var 列只是虚拟数据。

acct_num dt 变量1 变量2 变量3 var4 变量5
1234 2021-07-29 1 7 1 3 8
1234 2021-07-30 7 3 8 6 0
1234 2021-07-31 6 4 7 2 1
1234 2021-08-01 4 2 5 2 1
1234 2021-08-02 6 5 2 4 1
1234 2021-08-03 1 7 1 3 8
1234 2021-08-04 7 3 8 6 0
1234 2021-08-05 6 4 7 2 1
1234 2021-08-06 2 6 4 6 4

因此,理想情况下,根据我声明的 event_date 变量,我希望以以下方式返回结果:EX,如果我将事件日期声明为“2021-08-04”,我将查找带有dt '2021-07-30' 到 '2021-08-04'不包括dt = '2021-08-02' 的行。

如果 event_date 设置为“2021-08-05”,则同样适用,我希望 dt 在“2021-07-31”和“2021-08-31”之间的行,不包括dt = '2021-08' 的行-02' 和 2021-08-04'。

让我知道这是否有帮助或是否需要更多说明。

谢谢!

4

1 回答 1

0

您将需要一个日期排除表,在这种情况下使用table variable

然后根据范围制作一个完整列表并制作一个DERIVED TABLE,使用派生表用于NOT EXISTS删除排除的日期

declare @tableofexclusions table (maindate date,excludeddate date)

insert into @tableofexclusions
values ('2021-08-04','2021-08-02'),
('2021-08-05','2021-08-02'),
('2021-08-05','2021-08-04')

select * from ( -- generate list within the range
SELECT
  acct_num,
  dt,
  var1,
  var2,
  var3,
  var4,
  var5,
  @event_date eventdate
/*dt column is the date*/
FROM TEST_DB t1
WHERE dt BETWEEN @start_date AND @end_date 
AND acct_num = 12345
) x
where 
not exists (  -- remove dates matching from tableofexclusions based on the event
select 1 from @tableofexclusions t2
where t2.maindate = x.eventdate
and t2.excludeddate = x.dt
)
于 2021-11-10T02:27:59.043 回答