[SQL] Running difference (verschil tussen rijen)

Pagina: 1
Acties:
  • 192 views sinds 30-01-2008
  • Reageer

  • insan1ty
  • Registratie: Oktober 2001
  • Laatst online: 15-03-2023
Ik heb een klein (maar misschien niet simpel) probleempje met SQL.
Ik heb een MS SQL server waar een applicatie bij draait die het mogelijk maakt om queries op een database uit te voeren. Deze queries kan ik zelf ingeven. Ik heb nu het volgende probleem:

code:
1
2
3
4
5
6
7
8
9
+-------+---------+-----------------------+
|key    |activity |timestamp              |
+-------+---------+-----------------------+
|0      |Complete |2007-05-07 09:51:30 AM |
|1      |Complete |2007-05-07 09:52:30 AM |
|2      |Complete |2007-05-07 09:54:30 AM |
|3      |Complete |2007-05-07 09:56:30 AM |
|4      |Complete |2007-05-07 09:57:30 AM |
+-------+---------+-----------------------+


Ik heb deze tabel en ik wil het verschil in seconden weten tussen de timestamps van de verschillende rijen. Is hier een standaard SQL commando voor?

Er moet dus dit uit komen, if you catch my drift:
code:
1
2
3
4
5
6
7
8
9
+-------+---------+-----------------------+-----+
|key    |activity |timestamp              |diff |
+-------+---------+-----------------------+-----+
|0      |Complete |2007-05-07 09:51:30 AM |NULL |
|1      |Complete |2007-05-07 09:52:30 AM |60   |
|2      |Complete |2007-05-07 09:54:30 AM |120  |
|3      |Complete |2007-05-07 09:56:30 AM |120  |
|4      |Complete |2007-05-07 09:57:30 AM |60   |
+-------+---------+-----------------------+-----+

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:51
DateDiff?

Roomba E5 te koop


  • insan1ty
  • Registratie: Oktober 2001
  • Laatst online: 15-03-2023
Dat werkt alleen tussen kolommen in dezelfde rij..

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Als de key inderdaad oplopend is zou je een subquery kunnen doen door select top 1 where key < huidige key
pseudo:
SQL:
1
2
select 
  datediff (t1.timestamp, (select top 1 timestamp from tabel t2 where t2.key < t1.key order by t2.key desc) as runtime from tabel t1

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 01-12 17:00

pistole

Frutter

of zo:
SQL:
1
2
3
4
select 
    t.*, 
    datediff(second, timestamp, (select timestamp from tabel where id=t.id+1)),
from tabel t

(ik deed hem precies andersom; ik vergelijk met het volgende record...)

[ Voor 21% gewijzigd door pistole op 07-05-2007 10:13 ]

Ik frut, dus ik epibreer


  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

@pistole: dit werkt alleen als er geen gaten in de 'key' zitten ...

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Het probleem is denk ik niet de functie, maar het gegeven dat je een resultaat uit de vorige rij moet hebben.

Onderstaande moet wel werken denk ik
SQL:
1
2
3
SELECT key, activity, timestamp, 
    (SELECT TOP 1 DateDiff(ss,timestamp,t1.timestamp) FROM tabel t2 WHERE timestamp < t1.timestamp ORDER BY Timestamp DESC) Diff
FROM tabel t1


Het zou traag kunnen zijn door de subquery. Er is dan denk ik nog wel een oplossing met een join.

edit:
traag :z

Oops! Google Chrome could not find www.rijks%20museum.nl


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 01-12 17:00

pistole

Frutter

TheRookie schreef op maandag 07 mei 2007 @ 10:13:
@pistole: dit werkt alleen als er geen gaten in de 'key' zitten ...
Helemaal mee eens, je krijgt anders een NULL terug.
De tip van P_de_B om het met een join te doen is wellicht slimmer (sneller), maar dan geldt dezelfde beperking.
Je kan veiligheidshalve misschien een view over de tabel gooien met daarin een nieuwe identity kolom om zeker te weten dat je 'key' kolom aansluitend is.

Ik frut, dus ik epibreer


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Mijn oplossing werkt met gaten in de key ;)


edit:
en die van TheRookie ook zie ik :)

[ Voor 35% gewijzigd door P_de_B op 07-05-2007 10:22 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • insan1ty
  • Registratie: Oktober 2001
  • Laatst online: 15-03-2023
Bedankt voor de tips! Ik ga het zo even proberen..

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

P_de_B schreef op maandag 07 mei 2007 @ 10:14:
[...]

Het zou traag kunnen zijn door de subquery. Er is dan denk ik nog wel een oplossing met een join.
Ik heb vergelijkbare constructies wel eens met een subquery, inner join en cross join gebouwd, en uit de query optimizer rolt uiteindelijk toch wel hetzelfde execution path. We hebben het hier over een echt DBMS he, niet MySQL ;)

Professionele website nodig?


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
curry684 schreef op maandag 07 mei 2007 @ 11:12:
[...]

Ik heb vergelijkbare constructies wel eens met een subquery, inner join en cross join gebouwd, en uit de query optimizer rolt uiteindelijk toch wel hetzelfde execution path. We hebben het hier over een echt DBMS he, niet MySQL ;)
Dat denk ik ook wel, maar toch: http://www.sqlteam.com/item.asp?ItemID=3856 ;)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ik gebruik eigenlijk nooit temp tables, dus misschien een domme vraag. Maar geeft dat geen concurrency problemen als je veel requests krijgt voor precies die query?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Tijdelijke tabellen die je aanmaakt met een #-teken zijn alleen benaderbaar binnen de huidige scope, andere gebruikers kunnen de tabellen niet zien. (Het zijn eigenlijk 'fysieke tabellen in de tempdb met een numerieke suffix). Tijdelijke tabellen met twee ##-tekens zijn wel globaal.

CREATE TABLE #temp = lokaal
CREATE TABLE ##temp = globaal

Oops! Google Chrome could not find www.rijks%20museum.nl


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

Hmmm verbazend dat de Guru Guide solution zo traag blijkt daar, die zou ik zelf ook voorgesteld hebben 8)7

Professionele website nodig?

Pagina: 1