wypełnianie "luk"

0

Witam.

Czy da rade w zapytaniu wypełnić "luki" w danych?
Mam taką tabelkę:

id id_pracownika id_zadania czas_start czas_stop
1 1 1 1000 1000
2 1 4 1100 1100
3 1 3 1200 1200
4 1 7 1300 1300
5 2 1 1000 1100
6 2 4 1200 1300
7 2 2 1500 1700

Chciałbym w "raporcie" uzyskać coś takiego:
id_pracownika | id_zadania | czas_start | czas_stop | czas
1 | 1 | 1000 | 1000 | 0000
1 | 0 | 1000 | 1100 | 0000
1 | 4 | 1100 | 1100 | 0000
1 | 0 | 1100 | 1200 | 0000
1 | 3 | 1200 | 1200 | 0000
1 | 0 | 1200 | 1300 | 0000
1 | 7 | 1300 | 1300 | 0000
2 | 1 | 1000 | 1100 | 0100
2 | 0 | 1100 | 1200 | 0000
2 | 4 | 1200 | 1300 | 0100
2 | 0 | 1300 | 1500 | 0200
2 | 2 | 1500 | 1700 | 0200

czyli wypełnić czas między kolejnymi zadaniami, "przerwą" (o id 0).

Da radę to zrobić zapytaniem czy robić to po stronie klienta?

Z góry dziękuje.

1

@hipek wstydził byś się - takie proste :P

create table test2 (
  id_prac integer,
  id_zad integer,
  czas_start varchar(8),
  czas_stop varchar(8)
);

insert into test2 values (1, 1, '10:00:00', '10:32:00'), (1,	4,	'11:00:00',	'11:20:00'), (1,	3,	'12:00:00',	'12:32:00'), (1,	7,	'13:00:00',	'13:11:00');
insert into test2 values (2, 1, '10:00:00', '11:20:00'), (2,	4,	'12:00:00',	'13:00:00'), (2,	2,	'15:00:00',	'17:00:00');

select
  id_prac,
  id_zad,
  czas_start,
  czas_stop
from
  test2
union
select
  t1.id_prac,
  0 id_zad,
  t1.czas_stop czas_start,
  min(t2.czas_start) czas_stop
from test2 t1
  join test2 t2 on t1.id_prac = t2.id_prac and t2.czas_start > t1.czas_stop
  left join test2 t3 on t1.id_prac = t2.id_prac and t1.czas_stop = t3.czas_start
where
  t3.id_prac is null
group by
  t1.id_prac,
  t1.czas_stop
order by
  id_prac, czas_start

SQL.png

t3 jest po to aby wyeliminować powtórzenia kiedy czas końca poprzedniej równa się czas początku następnej

0

Wiem, że to proste, ale chciałem żeby ktoś się mógł wykazać ;).

A tak serio: dziękuje bardzo! Jakoś na to nie wpadłem ;).

1 użytkowników online, w tym zalogowanych: 0, gości: 1