dr-sm
Новичок
SQL: Пятничная задача
дано:
необходимо получить следующий датасет:
где:
lat1 = lat, если lat != 0, иначе предидущее ненулевое значение lat или 0 если нет.
lat2 = lat, если lat != 0, иначе последующее ненулевое значение lat или 0 если нет.
lng аналогично.
order by id
у меня получилось сделать одним (почти
) запросом.
разминаем мозг, предлагаем варианты
-~{}~ 12.04.10 13:08:
ответ, может кому-нибуть будет интересно хотя, судя по всему, нет:
дано:
Код:
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
у меня получилось сделать одним (почти

разминаем мозг, предлагаем варианты

-~{}~ 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;