#sql #sql-server #sql-server-2012
#sql #sql-сервер #sql-server-2012
Вопрос:
У меня есть таблица с ежедневными датами, начиная с 31 декабря 1999 года по 31 декабря 2050 года, исключая выходные.
Допустим, задана конкретная дата, для этого примера давайте использовать 2019-03-14. Я хочу выбрать дату, которая была за 30 дней до этого (количество дней должно быть гибким, поскольку оно не всегда будет 30), игнорируя выходные, которые в данном случае были бы 2019-02-01.
Как это сделать?
Я написал запрос ниже, и в нем действительно перечислены 30 дней, предшествующих указанной дате.
select top 30 Date
from DateDimension
where IsWeekend = 0 and Date <= '2019-03-14'
order by Date desc
Итак, я подумал, что мог бы использовать приведенный ниже запрос, чтобы получить правильный ответ от 2019-02-01
;with ds as
(
select top 30 Date
from DateDimension
where IsWeekend = 0 and Date <= '2019-03-14'
)
select min(Date) from ds
Однако это не работает. Он возвращает мне первую дату в моей таблице, 1999-12-31.
2019-03-14
2019-03-13
2019-03-12
2019-03-11
2019-03-08
2019-03-07
2019-03-06
2019-03-05
2019-03-04
2019-03-01
2019-02-28
2019-02-27
2019-02-26
2019-02-25
2019-02-22
2019-02-21
2019-02-20
2019-02-19
2019-02-18
2019-02-15
2019-02-14
2019-02-13
2019-02-12
2019-02-11
2019-02-08
2019-02-07
2019-02-06
2019-02-05
2019-02-04
2019-02-01
Ответ №1:
TOP не имеет смысла без ORDER BY, поэтому вы могли бы сделать что-то вроде
;with ds as
(
select top 30 Date
from DateDimension
where IsWeekend = 0 and Date <= '2019-03-14'
order by Date DESC
)
select min(Date) from ds;
еще лучше было бы использовать синтаксис ANSI вместо TOP:
select Date
from DateDimension
where IsWeekend = 0 and Date <= '2019-03-14'
order by Date DESC
OFFSET 30 ROWS FETCH NEXT 1 ROW ONLY;
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ — код не протестирован, поскольку вы не предоставили DDL и образцы данных
HTH
Комментарии:
1. Спасибо! Я использовал синтаксис ANSI в качестве ВЕРХНЕГО, даже при заказе by все равно возвращалась первая дата в моей таблице