1

Temat: update timestamp

Witam,

proszę o podpowiedź, mam tabele z 1500 rekordów która ma takie kolumny id,imie,nazwisko,pesel,timestamp
np 1, michal,michal,11111000111, 2012-12-30 00:00:00
     2, kasia,kasia, 22222000111,2012-12-30 00:00:00
itd do 1500

chodzi o napisanie query które dodaje minutę do każdego kolejnego rekordu


np 1, michal,michal,11111000111, 2012-12-30 00:01:00
     2, kasia,kasia, 22222000111,2012-12-30 00:02:00
itd do 1500


czy macie jakiś pomysł jak to ugryź?

2

Odp: update timestamp

Problem polega na tym, że najpierw musisz ustalić prawidłowa kolejność rekordów. Ja założyłem, że pole timestamp, które nazwałem "data" ma stałą wartość, a kolejność dodawania rekordów wyznacza pole id (im większa liczba w id tym później rekord został dodany). Ale gdyby było inaczej dodałem dodatkowe sortowanie też po polu data w poniższym update (co nic nie zmienia przy moich założeniach)

update tabela t set data=d.nowa_data from
(select t.id ,data+row_number () over(order by data,id ) * interval '00:01:00' as nowa_data from tabela t) d where t.id=d.id

3

Odp: update timestamp

dostałem błąd:
BŁĄD:  błąd składni w lub blisko "over"
LINE 2: (select t.id ,czas+row_number () over(order by czas,id ) * i...
                                                                 ^

********** Błąd **********

4

Odp: update timestamp

Napisz którą wersją postgresql dysponujesz. jeśli masz wyższą niż 8.4 to wszystko powinno być OK.

5

Odp: update timestamp

mam wersje 8.3.7

6

Odp: update timestamp

no to trzeba wrócić do prehistorii smile:):)

wykonaj wszystkie komendy naraz

create sequence lp START WITH  1;
update tabela t set data=d.nowa_data from
(select id , data+nextval('lp') * interval '00:01:00' as nowa_data from (select t.id ,data from tabela t order by data,id) z) d where t.id=d.id;
drop sequence lp;

7

Odp: update timestamp

Czas chyba na aktualizacje postgresa


teraz mam takie cóś:
BŁĄD:  subquery in FROM cannot refer to other relations of same query level

********** Błąd **********

BŁĄD: subquery in FROM cannot refer to other relations of same query level
Stan SQL: 42P10

8

Odp: update timestamp

a sam select się wykonuje?

9

Odp: update timestamp

Moje zapytanie select wyglada tak:

(select t.id ,czas+nextval ('lp') * interval '00:01:00' as nowa_data from
(select t.id ,czas from zgloszenie t order by czas,id) z) t where t.id=d.id and opid='6667' and czas='2012-12-31 00:00:00' and pesel<>'0';


jak je uruchamiam to mam:
LINE 3: ...t.id ,czas from zgloszenie t order by czas,id) z) d where t....
                                                             ^

********** Błąd **********

BŁĄD: błąd składni w lub blisko "d"
Stan SQL: 42601
Znak: 134

10

Odp: update timestamp

Jak masz uprawnienia do utworzenia widoku to może zrób
1. create view v_tabela as select t.id ,czas from zgloszenie t where opid='6667' and czas='2012-12-31 00:00:00' and pesel<>'0' order by czas,id;
2. drop sequence lp;
3. create sequence lp START WITH  1;
4. update z tak zmodyfikowanym selectem
(select t.id ,czas+nextval ('lp') * interval '00:01:00' as nowa_data from v_tabela) t where t.id=d.id ;
5. drop sequence lp;

11

Odp: update timestamp

Jeśli nie zależy Ci na kolejności, a tylko by zmienić pole czas to może wystarczy zrobić tak:

drop sequence lp;
create sequence lp START WITH  1;
update zgloszenie set czas=czas+nextval ('lp') * interval '00:01:00' where opid='6667' and czas='2012-12-31 00:00:00' and pesel<>'0'

12

Odp: update timestamp

wielkie dzieki za pomoc, własnie o to chodziło...