繁体   English   中英

按日期限制查询结果

[英]Limiting query results by date

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

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 (或只是一个子查询)来计算开始日期。 一种或另一种方式,您需要将CTE或子查询JOIN您的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

最大日期减去四十天返回表中的两个最新条目:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM