powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как найти ближайшую предыдущую дату
6 сообщений из 6, страница 1 из 1
Как найти ближайшую предыдущую дату
    #40099041
Romanov-krd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Мне нужно выбрать значения дата, тип, минимальное, максимальное из таблиц и потом к ним присоединить значения ближайшей предыдущей даты ( в таблице предыдущая не обязательно вчерашняя). Я сделал это на основе cte. Но вопрос - как найти предыдущую дату вроде dateadd не подойдет т.к. мы то не знаем предыдущую дату Вот мой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
With cte as (
select  t.city,   t.reportdate, t.type ,min(t.cost), max(t.cost)
FROM
(
select t1.city, t1.type, t1.cost, t1.reportdate
from city_from_base1 t1
union ALL
select t2.city, t2.type, t2.cost, t2.reportdate
from city_from_base2 t2
) t
group by t.city, t.type,  t.reportdate
)
Select * from cte t1 left join cte t2 on t1.city=t2.city
and cast(t1.reportdate as integer) > cast(t2.reportdate as integer)
...
Рейтинг: 0 / 0
Как найти ближайшую предыдущую дату
    #40099061
Romanov-krd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот в этой строке какую функцию использовать?
Код: sql
1.
and cast(t1.reportdate as integer) > cast(t2.reportdate as integer)
...
Рейтинг: 0 / 0
Как найти ближайшую предыдущую дату
    #40099088
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проще всего через lag/lead, ну, или перенумеровать исходную выборку в порядке возрастания даты, и связать ее саму с собой (left join) по этому номеру = номер - 1
Можно еще через outer apply (select top(1) * from ... where Дата < нужной_даты Order by Дата), но это очень нехорошо с т.з. производительности.

Оформите вопрос в соответствии с требованиям форума - вам накидают примеров.
...
Рейтинг: 0 / 0
Как найти ближайшую предыдущую дату
    #40099109
Romanov-krd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uaggster,
Спасибо, вроде получилось.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
With cte as (
select  t.city,   t.reportdate, t.type ,min(t.cost) as min, max(t.cost) as max, row_number() over(partition by t.city) num
FROM
(
select t1.city, t1.type, t1.cost, t1.reportdate
from city_from_base1 t1
union ALL
select t2.city, t2.type, t2.cost, t2.reportdate
from city_from_base2 t2
) t
group by t.city, t.type,  t.reportdate
)
Select *
from cte t1 left join cte t2 on t1.num-1=t2.num and t1.city=t2.city
order by city



Так же?
...
Рейтинг: 0 / 0
Как найти ближайшую предыдущую дату
    #40099211
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ээээ... row_number() over(partition by t.city Order by t.reportdate ASC) num, наверное.
Ну и вот так min(t.cost), max(t.cost) - не взлетит.
Нужно, если уж вы уж в таком стиле хотите сделать min(t.cost) over(partition by t.city) min_cost, max(t.cost) over(partition by t.city) max_cost
...
Рейтинг: 0 / 0
Как найти ближайшую предыдущую дату
    #40099328
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanov-krd,

LAG
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как найти ближайшую предыдущую дату
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]