Faran Saleem Ответов: 2

Datediff для каждой строки agaimst максимальная строка


Привет,

У меня есть таблица SQL, где у меня есть столбец даты, и он имеет следующий формат 1yymmdd. Я преобразовал это в datetime, используя следующий sql-запрос.

Cast(left(right(ltrim(str(date,25,5)), LEN(ltrim(str(date,25,5)))-3),2) +'-' + left(right(ltrim(str(date,25,5)), LEN(ltrim(str(date,25,5)))-5),2) +'-' +
left(right(ltrim(str(date,25,5)), LEN(ltrim(str(date,25,5)))-1),2) as datetime)


Приведенный выше запрос дает мне дату в следующем формате гггг-ММ-ДД чч:мм:СС.
Но путаница заключается в том, что я хочу вычислить разницу дат каждой строки с максимальной датой, возвращаемой запросом.

например:

Если я запускаю запрос и он возвращает следующие 3 даты
2016-06-08 00:00:00.000
2016-06-05 00:00:00.000
2016-06-03 00:00:00.000

Таким образом, в приведенном выше результирующем наборе самая высокая дата-2016-06-08 00: 00: 00.000, и когда я вычисляю разницу между ней и другими 2 днями, она должна вернуть 3 и 5 дней соответственно,
поэтому я хочу рассчитать разницу между максимальной датой и любой другой датой и выбрать только те даты, которые имеют разницу менее 3 дней.

Я, как всегда, с нетерпением жду вашей помощи. Большое спасибо.

Что я уже пробовал:

Погуглил его и не смог найти никакой точной ситуации

2 Ответов

Рейтинг:
2

jamuro77

Что ж,

1) чтобы поставить дни в положительное значение, вам нужно только взять абсолютное значение или переключить порядок значений дат в функции datediff.

2) для фильтрации значений следует использовать общее табличное выражение, а затем выполнить фильтрацию.

Вот код:

;with cte as (select OrderDate, datediff(day,OrderDate,MAX(OrderDate) over()) as Days from sales)
select * from cte
where Days between 1 and 6
order by OrderDate desc


Faran Saleem

Но я уже использую CTE.. Используя их, потому что мне нужно было сравнить каждую строку с предыдущим значением.

Так как же я могу это сделать?

Рейтинг:
0

jamuro77

Привет, решение очень простое. Вам просто нужно использовать "оконную функцию SQL". В любом случае, взгляните на документацию SQL.

Предположим, у нас есть таблица с полем "OrderDate". Запрос, чтобы получить то, что вы хотите, будет следующим:

select OrderDate, datediff(day,MAX(OrderDate) over(),OrderDate) from sales
order by OrderDate desc


Обратите внимание, что оператор "over" выше в запросе.

С уважением.


Faran Saleem

Огромное спасибо за вашу помощь ... я запустил ваш запрос, и он отлично сработал всего за пару вопросов.

1. разница между датами приходит в отрицательном виде.
2. А как я могу выбрать записи с разницей между датой < 7

С нетерпением жду вашего ответа

Faran Saleem

И в приведенном выше примере мы вычитаем из максимальной даты.. что делать, если я хочу получить результаты только с разницей в 7 дней? Например, предположим, что у нас есть 4 следующие даты
2016-03-02
2016-03-04
2016-03-06
2016-06-08

В приведенном выше случае 2016-06-08-это максимальная дата, но разница между другими 3 датами составляет между 7 днями.
Поэтому я хочу отобразить только эти 3 даты, а не 2016-06-08