1 din 3
1
AJUTOR SQL Query
  [ Ignoră ]
Avatar
RankRankRank
Member
Din: Satu Mare & Bucuresti
Macuser din: 19.09.08

Am nevoie de ajutor foarte mare:D

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?

Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRank
Member
Din: Bucuresti - Baba Novac
Macuser din: 10.05.06

“...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?

 Semnătură 

cool smirk  Generally a smart-ass!

Profil
 
  [ Ignoră ]   [ # 2 ]
Avatar
RankRankRank
Member
Din: Satu Mare & Bucuresti
Macuser din: 19.09.08

folosesc SQLITE3 ca DB.

Profil
 
  [ Ignoră ]   [ # 3 ]
Avatar
RankRankRank
Member
Din: Satu Mare & Bucuresti
Macuser din: 19.09.08

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.

Profil
 
  [ Ignoră ]   [ # 4 ]
Avatar
RankRankRank
Member
Din: Bucuresti - Baba Novac
Macuser din: 10.05.06

poate te ajuta asta: http://chriswolf.heroku.com/articles/2011/01/26/adding-stored-procedures-to-sqlite/

 Semnătură 

cool smirk  Generally a smart-ass!

Profil
 
  [ Ignoră ]   [ # 5 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

In functie de baza de date utilizata , sintaxa are forme diferite .

Poti cauta functii analitice .

FUNCTION_NAME(<argument>,<argument>,?)
      OVER
      ( <Order-by-Clause> <Windowing Clause>)

Daca ne spui tipul de baza de date utilizata , as putea fi mai exact .

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 6 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

acum vad ca ai scris baza de date .
SQLLite stie sa faca cu un singur select aceasta interogare ( fara proceduri stocate )

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 7 ]
Avatar
RankRankRank
Member
Din: Satu Mare & Bucuresti
Macuser din: 19.09.08

@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.

Profil
 
  [ Ignoră ]   [ # 8 ]
RankRank
Jr. Member
Din: Bucuresti
Macuser din: 16.11.09

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.

Profil
 
  [ Ignoră ]   [ # 9 ]
Avatar
RankRankRank
Member
Din: Satu Mare & Bucuresti
Macuser din: 19.09.08

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

Profil
 
  [ Ignoră ]   [ # 10 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

incearca asa

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

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 11 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

nu merge editare :( , in selectul 2 , din paranteza , schimna y cu Timestamp , vroiam sa iti dau exemplu cu x si y si a ramas y neinlocuit smile

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 12 ]
Avatar
RankRankRank
Member
Din: Satu Mare & Bucuresti
Macuser din: 19.09.08

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

Profil
 
  [ Ignoră ]   [ # 13 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

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 .

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 14 ]
Avatar
RankRankRank
Member
Din: Ploiesti
Macuser din: 06.12.11

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)

succes

 Semnătură 


MacBook Pro 15”  i7 2.2GHz/ 16GB/ 500GB SSD ,  10.11
MacBook Air 13”  i5 1.3GHz/ 4GB/ 256GB SSD ,  10.11

Profil
 
  [ Ignoră ]   [ # 15 ]
Avatar
RankRank
Jr. Member
Din: Bucuresti
Macuser din: 12.06.10

select t.timestamp, t.eventtype, (x.timestamp - t.timestamp) * (t.rowid % 2) from t inner join t x on t.rowid = x.rowid - 1;

 Semnătură 



Profil
 
   
1 din 3
1