SQL: Пятничная задача

dr-sm

Новичок
SQL: Пятничная задача

дано:
Код:
drop table if exists tbl;
create table tbl (
id int not null,
event_id int not null,
lat int not null,
lng int not null,
constraint pk_tbl primary key(id)
);

insert into tbl(id, event_id, lat, lng) values
(70, 5, 0, 0),
(71, 5, 55, 66),
(73, 5, 66, 77),
(74, 5, 0, 0),
(75, 1, 0, 0),
(76, 6, 0, 0),
(77, 8, 50, 40),
(78, 8, 50, 39),
(79, 8, 51, 39),
(88, 5, 51, 39),
(89, 5, 0, 0),
(90, 1, 0, 0),
(91, 6, 0, 0),
(92, 5, 0, 0);
необходимо получить следующий датасет:
Код:
id, event_id, lat, lng, lat1, lng1, lat2, lng2
70	5	0	0	0	0	55	66
71	5	55	66	55	66	55	66
73	5	66	77	66	77	66	77
74	5	0	0	66	77	50	40
75	1	0	0	66	77	50	40
76	6	0	0	66	77	50	40
77	8	50	40	50	40	50	40
78	8	50	39	50	39	50	39
79	8	51	39	51	39	51	39
88	5	51	39	51	39	51	39
89	5	0	0	51	39	0	0
90	1	0	0	51	39	0	0
91	6	0	0	51	39	0	0
92	5	0	0	51	39	0	0
где:
lat1 = lat, если lat != 0, иначе предидущее ненулевое значение lat или 0 если нет.
lat2 = lat, если lat != 0, иначе последующее ненулевое значение lat или 0 если нет.
lng аналогично.
order by id

у меня получилось сделать одним (почти :D ) запросом.
разминаем мозг, предлагаем варианты :)

-~{}~ 12.04.10 13:08:

ответ, может кому-нибуть будет интересно хотя, судя по всему, нет:

Код:
create function foo(int, int) returns int
as 'select case when $2 != 0 then $2 else $1 end'
language sql;
 
create aggregate omg(int)
(
sfunc = foo,
stype = int,
initcond = 0
);

select id, event_id, lat, lng,
omg(lat) over(order by id) lat1,
omg(lng) over(order by id) lng1,
omg(lat) over(order by id desc) lat2,
omg(lng) over(order by id desc) lng2
from tbl order by id;
 

~WR~

Новичок
Да, комбинацией custom aggregates + window functions в один запрос можно сделать практически всё.
 

baev

‹°°¬•
Команда форума
~WR~, Вы — некрофил?

Хватит поднимать старые темы.
 
Сверху