Am un table ca si in poza atasata, care are 6 coloane si 500 de randuri.
As vrea sa execut un sql query pe acest tabel care selecteaza prima coloana “Timestamp”, a patra coloana “Event Type”.
Dar as mai vrea ca acest query sa mai faca o chestie, sa faca o coloana “Result” in care sa ia datele din prima coloana “Timestamp” si sa faca diferanta dintre al doilea rand cu primul, al patrulea cu al treilea si tot asa mai departe, exact ca si in a doua poza (cea care are doar 3 coloane)...
QUERY:
select Timestamp, “Event Type”, “Event Subject”
from profiling1
where “Event Type”<>‘START’ and “Event Type”<>‘END’
cam atat am scris pana acuma, chestia e ca sincer am cautat pe internet si nu am gasit nimic de genu ce vreau eu sa fac. E posibil ca sa se faca ceaa ce vreau eu?
“...si sa faca diferanta dintre al doilea rand cu primul, al patrulea cu al treilea si tot asa mai departe…”. Asta nu prea merge dintr-un query simplu. Aici intri pe domeniul procedurilor / functiilor stocate si procesarea resultset-ului direct din baza de date. Ce DB folosesti?
Am uitat sa spun ca am facut eu o applicatie in QT4 care are 3 taburi…primul e tablul unde e afisata DB, al doilea e unde scriu query si il execut…si in al treilea imi afiseaza rezultatul de la query.
@equinoxe mersi ma ajuta ca stiu ce sa caut si cum trebuie sa fac….dar linkul nu ma ajuta cu mult pentru ca folosesc QT si ei folosesc SQLITE de ei…deci nu prea pot sa addauga chestile alea.
@NaspaNick cum adica sqlite stie sa faca cu un singur select aceasta interogare. un exemplu sau mai explicit te rog.
Se poate face si dintr-un singur query atat timp cat reusesti sa identifici ordinea liniilor (cu un self join). Ideal ar fi ca fiecare linie ca contina un camp numeric care sa dea ordinea liniilor (un asa numit sequence sau identity), atunci faci self join intre camp si camp - 1. Daca nu poti adauga un asemenea camp direct in tabela sau daca exista riscul sa existe gauri (cauzate de stergeri) poti sa creezi o tabela temporara in care bagi campurile care te intereseaza plus acel camp cu ordinea si faci self join pe tabela temporara.
Ultima solutie este cursorul (un fel de brute force), parcurgi toate liniile in ordine si cu ajutorul unor variabile temporare faci ce ai nevoie. Totusi, aceasta metoda este teribil de ineficienta, la 500 de linii nu conteaza foarte mult, dar la seturi de date mai mari este foarte lenta.
Ce am zis eu aici este valabil pentru sql standard, n-am lucrat cu SqlLite si nu stiu daca suporta campuri sequence/identity sau ceva echivalent.
ok…acuma o sa par poate putin nesimtit….dar e posibil ca cineva sa imi scrie acel query…
sincer de accea am cerut ajutor ca nu prea stiu multe despre SQL si query-ul asta e un fel de demonstratie….sa vad daca merge applicatia care am creato.
Multumesc mult :D
select Timestamp,“Event Type”,
(Timestamp-(select y from profiling1 as ty where ty.rowid=tx.rowid-1))*
(CASE rowid/2 WHEN round(rowid/2,0) THEN 1 ELSE 0 END) as Result
from profiling1 as tx
nu am unde sa fac un test acum , dar sper sa ai succes
select Timestamp,“Event Type”,
(Timestamp-(select Timestamp from profiling1 as ty where ty.rowid=tx.rowid-1))*
(CASE rowid/2 WHEN round(rowid/2,0) THEN 1 ELSE 0 END) as Result
from profiling1 as tx
Am executat query-ul functioneaza pe jumatate…imi afiseaza 3 coloane Timestamp, Event Type si Result dar in result totul e gol si cel mai ciudat ii ca ii imi scrie ca Query-ul e OK
adauga in interogare sa iti returneze si rowid, round(rowid,0) ( sa vezi ce face case ) , pune chiar sa iti returneze intr-o coloana rezultatul lui case , etc ( tot ce ai nevoie ca sa iti dai seama daca iti returneaza valori corecte )
nu pot de la distanta care este cauza .
Teoretic , daca respecti principiul din interogarea aceasta , trebuie sa ai un rezultat corect .
mai m-am gandit ( drumul spre casa ajuta )
nu iti returneaza nimic pentru ca in subquery ai intotdeauna rowid=1
uite o solutie mai buna
select Timestamp,“Event Type”,
(Timestamp-(select min(Timestamp) from profiling1 as ty where ty.Timestamp>tx.Timestamp)) as Result
from profiling1 as tx
o sa mearga daca coloana Timestamp este ordonata crescator , adica intotdeauna valoarea de pe rindul n este mai mica decit valoare de pe rindul n+1 .
daca vrei sa mai optimizezi putin , si sa ai rezultat numai pe anumite rinduri , pentru coloana Result poti scrie asa
(CASE “Event Type” WHEN ‘RAGENT loading’ THEN 0 WHEN ‘LOCK’ THEN 0 ELSE (Timestamp-(select min(Timestamp) from profiling1 as ty where ty.Timestamp>tx.Timestamp)) END)