Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли обойтись без user aggregation function? / 5 сообщений из 5, страница 1 из 1
06.01.2020, 16:44
    #39911166
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обойтись без user aggregation function?
Есть набор статусов для устройств : 0-4

Конечный код для устройства после агрегации должен определятся следующим правилом: ( 3 < 4) < 2 < 0 < 1

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
-- Device status priority
-- ( 3 < 4) < 2 < 0 < 1

declare @tbl table (id int not null identity primary key, code int, dev int not null );

insert into @tbl values ( 3, 1 )
insert into @tbl values ( 3, 2 ), (4, 2)
insert into @tbl values ( 3, 3 ), (4, 3), (2, 3)
insert into @tbl values ( 4, 4 ), (2, 4), (0, 4)
insert into @tbl values ( 3, 5 ), (1, 5), (0, 5), (2, 5)

select * from @tbl

declare @result table (code int, dev int not null );

insert into @result values ( 3, 1 )
insert into @result values ( 4, 2 )
insert into @result values ( 2, 3 )
insert into @result values ( 0, 4 )
insert into @result values ( 1, 5 )

select * from @result
...
Рейтинг: 0 / 0
06.01.2020, 16:55
    #39911168
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обойтись без user aggregation function?
Можно конечно 4 делитами решить но вдруг есть решение для селекта?
...
Рейтинг: 0 / 0
06.01.2020, 17:39
    #39911172
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обойтись без user aggregation function?
Lepsik,

CASE-ом преобразовать статусы в правильную последовательность и потом по ROW_NUMBER взять последний для каждого
...
Рейтинг: 0 / 0
06.01.2020, 17:41
    #39911173
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обойтись без user aggregation function?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
(
 select
  a.*, b.priority, row_number() over (partition by a.dev order by b.priority) as rn
 from
  @tbl a join
  (values (3, 4), (4, 3), (2, 2), (0, 1), (1, 0)) b(code, priority) on b.code = a.code
)
select
 code, dev
from
 t
where
 rn = 1
order by
 dev;
...
Рейтинг: 0 / 0
06.01.2020, 18:15
    #39911181
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли обойтись без user aggregation function?
invm,

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


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