Ik krijg een tabel met tijden uit een klok applicatie. De tabel ziet er als volgt uit:
Een voorbeeldje van de data (dit betreft slechts 1 pasnummer, er zijn er vele honderden)
Het veld IsEersteBoeking geeft aan of een klokactie de eerste boeking is van een dienst. Het veld InOfUit geeft aan of een klokactie een 'In' boeking is (b) of een 'uit' boeking (e). Logischerwijs is de waarde van InOfUit 'B' voor elk record waarbij IsEersteBoeking op 1 staat.
Ik moet nu de overige records om en om updaten met 'b' of 'e'. In bovenstaand voorbeeld zou voor 4 april de volgende gegevens correct zijn:
Het eerste record van de dienst per is dus alstijd een b, de volgende e dan weer een b etc. Dit geldt dus per pasnummer.
Het volgende script doet wat ik wil, maar is erg traag:
Heeft iemand een beter idee?
code:
1
2
3
4
5
6
7
8
| CREATE TABLE [TimeKeeperTussenTabel] (
[TimeKeeperID] [bigint] IDENTITY (1, 1) NOT NULL ,
[Pasnummer] [int] NOT NULL ,
[DatumTijd] [datetime] NOT NULL ,
[InOfUit] [char] (1) COLLATE Latin1_General_CI_AS NOT NULL ,
[Handled] [bit] NOT NULL ,
[IsEersteBoeking] [bit] NOT NULL )
GO |
Een voorbeeldje van de data (dit betreft slechts 1 pasnummer, er zijn er vele honderden)
code:
1
2
3
4
5
6
7
8
9
10
11
12
| 13491 2365 06-04-2005 15:38:00 0 0
13661 2365 06-04-2005 12:51:00 0 0
13976 2365 06-04-2005 11:55:00 0 0
14369 2365 06-04-2005 7:57:00 b 0 1
14816 2365 05-04-2005 16:58:00 0 0
15491 2365 05-04-2005 12:54:00 0 0
15815 2365 05-04-2005 11:57:00 0 0
16224 2365 05-04-2005 7:55:00 b 0 1
16656 2365 04-04-2005 17:09:00 0 0
17174 2365 04-04-2005 12:17:00 0 0
17598 2365 04-04-2005 12:00:00 0 0
18448 2365 04-04-2005 7:56:00 b 0 1 |
Het veld IsEersteBoeking geeft aan of een klokactie de eerste boeking is van een dienst. Het veld InOfUit geeft aan of een klokactie een 'In' boeking is (b) of een 'uit' boeking (e). Logischerwijs is de waarde van InOfUit 'B' voor elk record waarbij IsEersteBoeking op 1 staat.
Ik moet nu de overige records om en om updaten met 'b' of 'e'. In bovenstaand voorbeeld zou voor 4 april de volgende gegevens correct zijn:
code:
1
2
3
4
| 16656 2365 04-04-2005 17:09:00 e 0 0
17174 2365 04-04-2005 12:17:00 b 0 0
17598 2365 04-04-2005 12:00:00 e 0 0
18448 2365 04-04-2005 7:56:00 b 0 1 |
Het eerste record van de dienst per is dus alstijd een b, de volgende e dan weer een b etc. Dit geldt dus per pasnummer.
Het volgende script doet wat ik wil, maar is erg traag:
code:
1
2
3
4
5
6
7
| UPDATE TimeKeeperTussenTabel
SET InOfUit = CASE(
SELECT Count(*) FROM TimeKeeperTussenTabel WHERE DatumTijd <= T1.DatumTijd AND Pasnummer = T1.Pasnummer AND DatumTijd >
(SELECT TOP 1 DatumTijd FROM TimeKeeperTussenTabel WHERE DatumTijd < T1.DatumTijd AND IsEersteBoeking = 1 AND Pasnummer =T1.Pasnummer ORDER BY DatumTijd DESC))
%2 WHEN 1 THEN 'E' ELSE 'B' END
FROM TimeKeeperTussenTabel T1
WHERE Handled = 0 AND IsEersteBoeking = 0 |
Heeft iemand een beter idee?
Oops! Google Chrome could not find www.rijks%20museum.nl