Ограничение результатов запроса по дате - PullRequest
0 голосов
/ 17 июня 2020

У меня есть рабочий запрос, составленный из нескольких предложений Join. Один из столбцов - RecordDate. Я хочу отображать только записи при следующем условии: RecordDate> ((Max (RecordDate) для всего отчета) -40) дней. Другими словами, записи датируются Максом датой или 40 днями ранее. Я заметил, что не могу вычислить дату-40 в предложении WHERE, поэтому я создал запрос 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>

На правильном ли я пути? Спасибо за помощь.

Амос

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Я бы просто использовал 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

Максимальная дата минус сорок дней возвращает две последние записи в таблице:

+-----+
| val |
+-----+
|   2 |
|   3 |
+-----+
1 голос
/ 17 июня 2020

Один вариант использует оконные функции. Исходя из вашего псевдокода, это будет выглядеть так:

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)
...