[英]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.