按日期限制查询结果

Limiting query results by date

我有一个由多个 Join 子句构造的工作查询。其中一列是 RecordDate。 我只想在以下条件下显示记录: RecordDate > ((Max(RecordDate) for the whole report)-40) 天。换句话说,记录约会最大日期或 40 天前。 我注意到我无法计算 WHERE 子句中的 date-40,因此我创建了一个 date_CTE 查询来给我计算出的 "old-date".

WITH date_CTE(PrevDate,sd) AS
    (SELECT dateadd(DAY,-33,max(ScanDate)),ScanDate
    FROM v_TthreatsCombined
    GROUP BY scanDate)
    SELECT MAX(prevDate) FROM date_CTE

我未能将 "SELECT MAX(prevDate) FROM date_CTE" 的结果加入 WHERE。

查询看起来有点像这样:

SELECT col1,col2.col3,ScanDate
FROM table1
Left Join ....
Left Join ...
WHERE condition1 AND (condition2 OR condition3) AND <SELECT MAX(prevDate) FROM date_CTE>

我走在正确的道路上吗? 谢谢你的帮助。

阿摩司

一个选项使用 window 函数。根据您的伪代码,这看起来像:

select *
from (
    select col1, col2, col3, scandate, max(scanDate) over() maxScanDate
    from table1
    left join ....
    left join ...
    where condition1 and (condition2 or condition3)
) t
where scanDate > dateadd(day, -33,  maxScanDate)

我只会使用 CTE(或只是一个子查询)来计算开始日期。不管怎样,您需要 JOIN CTE 或子查询到您的 FROM 子句中。我会在连接上进行过滤。

DECLARE @t TABLE (dt DATE, val INT);

INSERT @t (dt, val)
VALUES ('20200101', 1),
       ('20200201', 2),
       ('20200301', 3)


WITH date_CTE(StartDt) AS 
(
    SELECT DATEADD(DAY, -40, MAX(dt)) AS StartDt
    FROM @t
)
SELECT val
FROM @t AS T
JOIN
    date_CTE AS d
    ON T.dt >= d.StartDt

最大日期减去四十天 returns table 中的两个最新条目:

+-----+
| val |
+-----+
|   2 |
|   3 |
+-----+