[T-SQL] Verschil tussen twee niet null records

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 08:32
Ik ben al twee dagen aan het zwoegen over een performante query, maar helaas

Ik heb 1 tabel waarin elke minuut een de kilowatt-meter stand van een 50-tal meters wordt weggeschreven.
Elke meter verliest soms verbinding en dan wordt er die minuut een null waarde weggeschreven.

Dat ziet er ongeveer zo uit
timestampVAL1VAL2VAL3
2012/09/01 10:011205
2012/09/01 10:022227
2012/09/01 10:03null239
2012/09/01 10:043null11
2012/09/01 10:0532412


Nu wil een view die er zo uit ziet

timestampVAL1VAL2VAL3
2012/09/01 10:01000
2012/09/01 10:02122
2012/09/01 10:03012
2012/09/01 10:04102
2012/09/01 10:05011


Deze werkt, maar is veel te traag.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT t .timestamp, 
       A.VAL1- LAG(A.VAL1) OVER (ORDER BY A.timestamp) AS VAL1, 
       B.VAL2- LAG(B.VAL2) OVER (ORDER BY B.timestamp) AS VAL2, 
       C.VAL3- LAG(A.VAL3) OVER (ORDER BY B.timestamp) AS VAL2

FROM  tabel T 
LEFT JOIN
  tabel A ON T .timestamp = A.timestamp AND A.VAL1 IS NOT NULL
LEFT JOIN
  tabel B ON T .timestamp = B.timestamp AND B.VAL2 IS NOT NULL 
LEFT JOIN
  tabel C ON T .timestamp = C.timestamp AND C.VAL3 IS NOT NULL  


Vermoedelijk kunnen jullie betere suggesties geven.

[ Voor 72% gewijzigd door Baron op 25-10-2012 16:52 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Waarom wil je zo'n view? Is het niet makkelijker zoiets buiten SQL op te lossen? Dan haal je gewoon de ruwe data op en in je favoriete programmeertaal genereer je eenvoudig de data die je wilt hebben.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:11

Haan

dotnetter

Heb je misschien iets aan de IsNull() functie?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 10:03

Cyphax

Moderator LNX
Hoe ziet het execution plan eruit? Je kunt even proberen indexen te leggen op die kolommen VAL1 t/m VAL3 maar ik zou eerst goed naar het execution plan kijken om te zien waar de kosten vandaan komen.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 08:32
@HuHu
De bedoeling is dat er energy rapporten gegenereerd worden.
Voor dit rapport kunnen bewerkingen nodig zijn VAL1*100/(VAL1+VAL2) en verder worden gegroepeerd by month, day, ...
Hiervoor gebruiken wij de reporting services

@Haan
Met de IsNull functie ben ik ook aan het experimenteren geweest. Maar het kan zijn dat er meedere null waarden achter elkaar komen. Ik moet de vorige niet null waarde hebben om het verschil te kunnen maken.

Acties:
  • 0 Henk 'm!

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 08:32
@Cyphax
Tja daar wringt het schoentje. Ik ben geen echte SQL server specialist. Geen flauw idee wat een execution plan is.
Zou ik een index op elke VAL1, VAL2, ... moeten leggen. In de echte tabel zijn het er 50.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Dan zou ik een tweede tabel aanleggen met daarin de verschil-records. Op het moment dat er dan een INSERT wordt gedaan in de data-tabel, doe je ook (automatisch, trigger) een INSERT in de verschil-tabel. Dat kost éénmaal veel rekenkracht om de verschil-tabel te vullen met de huidige data en daarna is de berekening per INSERT verwaarloosbaar.
Pagina: 1