Avatar billede hsko Nybegynder
03. april 2012 - 09:09 Der er 10 kommentarer og
1 løsning

Udpege stigende eller faldende værdier ud fra datoer fra tabel

Jeg vil gerne have noget hjælp til at lave en forespørgsel, hvor jeg får listet datoer og værdier som er større end/lig med den foregående record - og en tilsvarende for mindre end/lig med foregående værdi.

Jeg har følgende tabel:

  Dato  Værdi
1  01-01 4
2  02-01 2
3  03-01 1
4  04-01 3
5  05-01 4
6  06-01 6
7  07-01 7
8  08-01 4

Med en faldende værdi skal resultatet være 4,2,1
Med en stigende værdi skal resultatet være 1,3,4,6,7
Avatar billede Syska Mester
03. april 2012 - 09:22 #1
SELECT * table WHERE Dato = '01-01' ORDER BY [Værdi] ASC

ASC hvis mindst først

DESC hvis størst først.

Jeg er lidt i tvivl om det er overstående du søger, da jeg ikke helt forstår det format du vil have ud. Men overstående er antaget du er ny til SQL.

mvh
Avatar billede Slettet bruger
03. april 2012 - 10:32 #2
Hvis jeg fprstår di spørgsmål rigtigt skal resultaterne vel være:
Med en faldende værdi skal resultatet være 4,2,1,4
Med en stigende værdi skal resultatet være 3,4,6,7

?
Avatar billede hsko Nybegynder
03. april 2012 - 20:18 #3
Jeg prøver at tydeliggøre mit problem.
Min tabel består af id, dato og værdi.
For hver id skal det checkes om id+1 "værdi" er >= id "Værdi" hvilket skal give resultatet:

  Dato  Værdi
3  03-01 1
4  04-01 3
5  05-01 4
6  06-01 6
7  07-01 7

og med =< vil resultatet være

  Dato  Værdi
1  01-01 4
2  02-01 2
3  03-01 1

og også

7  07-01 7
8  08-01 4

Håber det giver mere mening nu.
Avatar billede Slettet bruger
03. april 2012 - 22:41 #4
Hvis du har SQL server 2012 kan du bruge LAG:

SELECT s1.*
FROM
(
SELECT Id, Dato, Værdi,
LAG(Værdi, 1,0) OVER (ORDER BY Id) ForrigVærdi
FROM Tabel
) s1
WHERE Værdi >= ForrigVærdi
Avatar billede Slettet bruger
03. april 2012 - 22:51 #5
eller hvis Id er fortløbende:

SELECT Id, Dato, Værdi
FROM Tabel t
WHERE Værdi >=
(SELECT Værdi
FROM Tabel
WHERE Id = t.Id-1
)
Avatar billede hsko Nybegynder
04. april 2012 - 07:52 #6
Du er meget tæt på at have løst mit problem. Jeg mangler at få den første værdi med også. Når jeg køre din forespørgslen får jeg resultatet:

  Dato  Værdi
4  04-01 3
5  05-01 4
6  06-01 6
7  07-01 7

og her mangler jeg så
3  03-01 1
Avatar billede Slettet bruger
04. april 2012 - 09:02 #7
Id 3 skal ikke med da Værdi ikke er >= Id 2.
Avatar billede hsko Nybegynder
04. april 2012 - 09:23 #8
Det har du ret i, men Id3 skal med da det er den første værdi i en kæde af stigende værdier. Der skal så checkes på at ID2 er større end ID3 og at efterfølgende ID'er er >=id-1
Avatar billede Slettet bruger
04. april 2012 - 10:29 #9
Med denne har du værdi før og efter og så må du kunne lave en regel:

SELECT * FROM
(
SELECT s.Id, s.Dato. s.Værdi
, tFør.Værdi AS VærdiFør
, tEfter.Værdi AS VærdiEfter
FROM
(
SELECT Id, Dato, Værdi
,(SELECT MAX(Id) FROM Tabel WHERE Id < t.Id) IdFør
,(SELECT MIN(Id) FROM Tabel WHERE Id > t.Id) IdEfter
FROM Tabel t
) s
RIGHT OUTER JOIN Tabel tFør
ON Id = s.IdFør
RIGHT OUTER JOIN Tabel tEfter
ON Id = s.IdEfter
) z
ORDER BY z.Id
Avatar billede hsko Nybegynder
04. april 2012 - 13:17 #10
Jeg har prøvet at teste din query, men får syntaxfejl i den anden select del + aliaset s efter FROM tabel t.
Avatar billede hsko Nybegynder
07. april 2012 - 09:28 #11
Fik queryen til at virke ved at tilføej et par aliasser i right join delen. Tusind tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester