[MSSQL] data uit volgende row gebruiken in select

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 23:47
Ik zit met een probleem dat simpel klinkt, maar waar in onderhand met allerlei subqueries, aggregate functies en termen die ik voor het eerst zie - niet meer uit kom.

Probleem is het volgende. Ik heb een tabel met functiewijzigingen, bijvoorbeeld;

Geldig vanafFunctieplaats
01-01-2010Assistent
20-06-2010Inactief
01-10-2010Assistent
19-11-2010Staflid


Nu wil ik in mijn select query een dynamische extra kolom genereren die de vanaf-datum van het volgende record weergeeft. Hierdoor krijg ik dus bruikbare records doordat ik ook de "einddatum" van een bepaalde functie meteen weet. Dit kan dan alleen bij het laatste record niet, maar die mag gewoon null teruggeven.

dus zo iets:
Geldig vanafFunctieplaatsGeldig tot
01-01-2010Assistent20-06-2010
20-06-2010Inactief01-10-2010
01-10-2010Assistent19-11-2010
19-11-2010Staflidnull


Geprobeerd: select met row_number over partition met een join op een nieuwe select met row_number over partition, waarbij in de laatste where clause een t2.rownr = (t1.rownr + 1).... maar dat mag niet kennelijk :(

Er zit vast wel iemand in de zaal die dit eerder heeft gedaan :)

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
Wat is er mis met iets als de volgende pseudo-SQL:
SQL:
1
SELECT TOP 1 vanaf WHERE vanaf > %huidige_vanaf% ORDER BY vanaf ASC

[ Voor 8% gewijzigd door kunnen op 19-11-2010 16:37 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

SQL:
1
2
3
4
5
6
SELECT t1.*, (
    SELECT MIN(GeldigVanaf)
    FROM tabel t2 WHERE t2.GeldigVanaf > t1.GeldigVanaf
) AS GeldigTot
FROM tabel t1
ORDER BY t1.GeldigVanaf

Zoiets?

Waarom zou je dit in een query willen doen trouwens?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 23:47
ehmz... maar die TOP gaat over de hele row neem ik aan?

[code=sql]
SELECT t1.vanaf, TOP 1 t2.vanaf as tot, functieplaats FROM table t1
INNER JOIN table t2 on t1.id=t2.id
WHERE t2.vanaf > t1.vanaf
ORDER BY vanaf ASC
[/code]


edit: het wordt neit de uiteindelijke query, maar onderdeel van een veel grotere stored procedure, die rekening moet gaan houden met de functieplaats van mensen op een bepaald tijdstip.

[ Voor 30% gewijzigd door Aesculapius op 19-11-2010 16:42 ]

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


Acties:
  • 0 Henk 'm!

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 23:47
NMe schreef op vrijdag 19 november 2010 @ 16:40:
SQL:
1
2
3
4
5
6
SELECT t1.*, (
    SELECT MIN(GeldigVanaf)
    FROM tabel t2 WHERE t2.GeldigVanaf > t1.GeldigVanaf
) AS GeldigTot
FROM tabel t1
ORDER BY t1.GeldigVanaf

Zoiets?

Waarom zou je dit in een query willen doen trouwens?
Dank...dat ik dat zo over het hoofd kan zien :S

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-10 16:03

Janoz

Moderator Devschuur®

!litemod

Je ziet zijn verdere vraag anders ook over het hoofd.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 23:47
die beantwoorde ik dacht ik in mijn vorige reply al; het is onderdeel van een stored procedure waarbij ik voor bepaalde data moet weten van welke functieplaats de betreffende persoon lid was. Daar hoeft geen einddatum aan te zitten (iemand die momenteel in dienst is, kent geen einddatum). Ik zou niet weten waarom ik dat niet in een query zou moeten doen?

edit; ik kan die "GeldigTot" overigens weer niet gebruiken in de WHERE clause, moet ik dan serieus die hele subselect gaan meenemen in de where? ("Invalid column name 'GeldigTot'.)

[ Voor 20% gewijzigd door Aesculapius op 19-11-2010 17:00 ]

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan gebruik je toch het kolomnummer in plaats van de naam? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 23:47
ehm, hoe doen we dat? :$ google me rot lol

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


Acties:
  • 0 Henk 'm!

Verwijderd

Vanuit het blote hoofd:

select Functieplaats.*, Geldigheid.* from
functiewijzigingen OUTER APPLY
(
select Max(Geldigtot) as [Geldig tot]
from Geldigheid
where Max(Geldigtot > GetDate())
and functiewijzigingen.Functieplaats = Geldigheid.Functieplaats
) as Geldigheid


met als resultaat:
Geldig vanaf Functieplaats Geldig tot
01-01-2010 Assistent 19-11-2010


kan zijn dat GetDate() veranderd moet worden in Now() voor MySQL.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Aesculapius schreef op vrijdag 19 november 2010 @ 17:06:
ehm, hoe doen we dat? :$ google me rot lol
Hmm, ik had je vraag verkeerd gelezen, volgens mij kun je in een where geen kolom per nummer aanspreken. :P
Da's (marginaal) trager dan de query die ik schreef en levert verder hetzelfde probleem op, helaas. :P Plus dat je resultaat niet klopt. ;)

[ Voor 3% gewijzigd door NMe op 19-11-2010 17:44 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Aesculapius
  • Registratie: Juni 2001
  • Laatst online: 23:47
Ik heb er een extra select * from ( omheen gezet - nu kan ik alles gewoon bij kolomnaam aanspreken.
Bedankt allen - ik was weer veel te ingewikkeld aan het denken...

dit is em geworden;
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT * FROM (
    SELECT t1.phys_code, t1.datum_vanaf, (
        SELECT MIN(datum_vanaf) FROM tbl_physicians_detail t2
        WHERE t2.datum_vanaf > t1.datum_vanaf AND t2.phys_code = t1.phys_code) as datum_tot,
        t1.functieplaats
    FROM tbl_table t1
) tdef

WHERE (tdef.datum_tot > @beginDate OR tdef.datum_tot is null)
ORDER BY tdef.datum_vanaf 

Zeg wat je doet en doe wat je zegt, dan wordt de hele wereld een stukje leuker


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 29-10 17:49

gorgi_19

Kruimeltjes zijn weer op :9

NMe schreef op vrijdag 19 november 2010 @ 17:43:
[...]

Hmm, ik had je vraag verkeerd gelezen, volgens mij kun je in een where geen kolom per nummer aanspreken. :P
je hebt toch ROW_Number in een CTE? Als je die aliassed moet je er bij kunnen, wordt wel vaker gebruikt bij paging vanaf SQL Server 2005 :)

[ Voor 16% gewijzigd door gorgi_19 op 19-11-2010 19:11 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Een rij en een kolom zijn twee verschillende dingen, tenzij je iets anders bedoelt dan ik denk. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 29-10 17:49

gorgi_19

Kruimeltjes zijn weer op :9

NMe schreef op vrijdag 19 november 2010 @ 19:16:
Een rij en een kolom zijn twee verschillende dingen, tenzij je iets anders bedoelt dan ik denk. :+
Ach, die dingen lijken ook zo op elkaar :P :+

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

gorgi_19 schreef op zaterdag 20 november 2010 @ 11:40:
[...]

Ach, die dingen lijken ook zo op elkaar :P :+
Mja, je hebt alleen maar een simpele matrixrotatie nodig. :+


* NMe geeft gorgi_19 een appeltje. :Y)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1