powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оконная функция
8 сообщений из 8, страница 1 из 1
Оконная функция
    #40089906
Pallich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Помогите, пожалуйста, написать используя оконную функцию запрос, который бы выводил в разрезе id для каждого цвета = 'black' какой именно был последний цвет но не равный 'red' или 'blue'.

Данные для примера:

create table #TestTable
(
date date,
id Varchar(10),
color Varchar(10)
)

insert into #TestTable (date,id,color)
values ('2021-01-01', '111', 'green'),
('2021-01-02', '111', 'red'),
('2021-01-03', '111', 'green'),
('2021-01-04', '111', 'black'),
('2021-01-01', '222', 'green'),
('2021-01-02', '222', 'blue'),
('2021-01-03', '222', 'black'),
('2021-01-01', '333', 'black'),
('2021-01-01', '444', 'blue')

Желаемый результат:
date------------id----------color----------prev_date----------prev_color
04.01.2021--111--------black----------03.01.2021--------green
03.01.2021--222--------black----------01.01.2021--------green
01.01.2021--333--------black----------null-----------------null




Microsoft SQL Server 2019 (RC1)
...
Рейтинг: 0 / 0
Оконная функция
    #40089912
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallich,

Код: sql
1.
2.
3.
4.
5.
6.
select
	*
from #TestTable t1
outer apply (select top(1) * from #TestTable t2 
           where t1.id=t2.id and t2.color not in ('red','blue') and t1.date>t2.date order by t2.date desc) a
where t1.color = 'black'
...
Рейтинг: 0 / 0
Оконная функция
    #40089916
Pallich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Громадное спасибо!
То что нужно.
Буду разбираться.
...
Рейтинг: 0 / 0
Оконная функция
    #40089918
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
через оконную функцию это так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select 
     date
    ,id
    ,prev_date=lag(date) over (partition by color order by date)
    ,prev_color=lag(color) over (partition by color order by date)
  from #TestTable
  where color='black'
  order by id
...
Рейтинг: 0 / 0
Оконная функция
    #40089965
Pallich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov,

Спасибо, но у вас результат не верный.
...
Рейтинг: 0 / 0
Оконная функция
    #40089977
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallich
spenov,

Спасибо, но у вас результат не верный.

... зато с over (partition by...)
...
Рейтинг: 0 / 0
Оконная функция
    #40089988
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallich,
это было обозначение направления, для подумать. у вас в задании не просто так же упомянуто слово "оконная".

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with
  d as (
	select 
		 date
		 ,id
		 ,color
		 ,prev_date=lag(date) over (partition by id order by date)
		 ,prev_color=lag(color) over (partition by id order by date)
	  from #TestTable
	  where color not in ('red', 'blue')
	)
  select *
    from d
    where color='black'
    order by id
...
Рейтинг: 0 / 0
Оконная функция
    #40090065
Pallich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spenov,

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


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