按日期限制查询结果
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 |
+-----+
我有一个由多个 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 |
+-----+