Piotr Czeczko

Piotr Czeczko Technical Director

Temat: zapytanie SQL

Witam,
mam taka tabelke:
CREATE TABLE test (id NUMBER, schema_name VARCHAR2(20), data date, status VARCHAR2(20))
INSERT INTO test VALUES (1,'SCHEMA1', To_Date('2008/01/01 08:00:00','YYYY/MM/DD HH24:MI:SS'),'OPEN' );
INSERT INTO test VALUES (2,'SCHEMA1', To_Date('2008/01/01 09:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (3,'SCHEMA1', To_Date('2008/01/01 10:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (4,'SCHEMA1', To_Date('2008/01/01 11:00:00','YYYY/MM/DD HH24:MI:SS'),'OPEN' );
INSERT INTO test VALUES (5,'SCHEMA2', To_Date('2008/01/01 09:00:00','YYYY/MM/DD HH24:MI:SS'),'OPEN' );
INSERT INTO test VALUES (6,'SCHEMA2', To_Date('2008/01/01 10:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (7,'SCHEMA2', To_Date('2008/01/01 11:00:00','YYYY/MM/DD HH24:MI:SS'),'OPEN' );
INSERT INTO test VALUES (8,'SCHEMA1', To_Date('2008/01/01 15:00:00','YYYY/MM/DD HH24:MI:SS'),'OPEN' );
INSERT INTO test VALUES (9,'SCHEMA1', To_Date('2008/01/01 18:00:00','YYYY/MM/DD HH24:MI:SS'),'OPEN' );
INSERT INTO test VALUES (10,'SCHEMA1', To_Date('2008/01/01 18:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (11,'SCHEMA1', To_Date('2008/01/02 18:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (12,'SCHEMA1', To_Date('2008/01/03 18:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (13,'SCHEMA1', To_Date('2008/01/04 18:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
INSERT INTO test VALUES (14,'SCHEMA1', To_Date('2008/01/05 18:00:00','YYYY/MM/DD HH24:MI:SS'),'CLOSED' );
COMMIT;

Zmiany na kontach sa logowane, bez wzgledu na to czy status schematu sie zmienil czy nie to jest zapisywany log o zmianie.
I teraz chce wyciagnac z tabeli tylko te rekordy, gdzie biezacy status ulegl zmianie (nie chce aby sie powtarzal wpis z tym samym statusem np rekordy z id 12,13,14 nie powinny byc pokazane i oczywiscie posortowane po dacie).
P.S.
Wiem ze mozna by bylo stworzyc druga tabele do ktorej wpisywane bylyby rekordy podczas zmiany wlasciwosci konta pod warunkiem zmiany statusu, ale na razie to nie wchodzi w gre.

Z gory dziekuje za pomoc.
Pozdrawiam

konto usunięte

Temat: zapytanie SQL

Proponuję wykorzystać funkcje analityczne, a dokładnie w tym przypadku LAG (pozwalającą zajrzeć do zawartości - domyślnie - "poprzedniego" wiersza).
SELECT id, schema_name, data, status
FROM
(SELECT a.*,
CASE WHEN lag (status) over (ORDER BY id) = status
THEN 'to_samo'
ELSE 'byla_zmiana'
END zmiana
FROM test a)
WHERE zmiana <> 'to_samo'
ORDER BY id

daje:

1,SCHEMA1,2008-01-01 08:00:00,OPEN
2,SCHEMA1,2008-01-01 09:00:00,CLOSED
4,SCHEMA1,2008-01-01 11:00:00,OPEN
6,SCHEMA2,2008-01-01 10:00:00,CLOSED
7,SCHEMA2,2008-01-01 11:00:00,OPEN
10,SCHEMA1,2008-01-01 18:00:00,CLOSED

Mam nadzieję, że o to chodziło, bo chwilę się musiałem zastanawiać o co biega ;).Dariusz W. edytował(a) ten post dnia 16.10.08 o godzinie 23:01
Piotr Czeczko

Piotr Czeczko Technical Director

Temat: zapytanie SQL

Dzieki wielkie wlasnie o to chodzilo :)

Następna dyskusja:

zapytanie sql oracle




Wyślij zaproszenie do