Ik heb een lijst met kloktijden van ons personeel. Mensen klokken bij aanvang van het werk, bij elke pauze en bij einde van de werkzaamheden.
Ik krijg de lijst met boekingen in een SQL Server 2k tabel. Deze tabel ziet er als volgt uit:
etc. etc.
De kolom IsEersteBoeking is een bitveld dat aangeeft of de boeking beschouwd kan worden als de eerste boeking van de dienst.
De kolom InOfUit moet per record bijhouden of het een IN-boeking ('B') of een UIT-boeking ('E') is. Voor de records waar IsEersteBoeking op 1 staat is dit geen probleem. Dit is altijd een IN-boeking.
Het probleem dat ik heb is het updaten van de kolom InOfUit. Als we pasnummer 1234 als voorbeeld aanhouden is het eerste record een B, het volgende record (van 10:00 uur) een E, het volgende weer een B etc. etc. Voor het updaten van de kolom InOfUit heb ik de volgende query:
Simpelweg kijkt deze query naar het aantal boekingen tussen het laatste IsEersteBoeking record van het betreffende pasnummer en het betreffende record. Is dit even krijgt het huidige record een 'B', ander een 'E'. Zo krijgende records mooi om en om, op volgorde van de datum, een B en een E. Dit werkt op zich wel, alleen is de query behoorlijk traag bij veel records. Iemand een idee in welke richting ik zou kunnen denken voor een snellere methode?
Overigens zijn de indexen etc. allemaal goed ingesteld, daar hoeven jullie het niet te zoeken.
Ik krijg de lijst met boekingen in een SQL Server 2k tabel. Deze tabel ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
| Pasnummer DatumTijd IsEersteBoeking InOfUit 1234 13/05/2004 8:00 1 1234 13/05/2004 10:00 0 1234 13/05/2004 10:10 0 1234 13/05/2004 12:00 0 3456 13/05/2004 5:00 1 3456 13/05/2004 8:00 0 3456 13/05/2004 8:15 0 3456 13/05/2004 12:00 0 |
etc. etc.
De kolom IsEersteBoeking is een bitveld dat aangeeft of de boeking beschouwd kan worden als de eerste boeking van de dienst.
De kolom InOfUit moet per record bijhouden of het een IN-boeking ('B') of een UIT-boeking ('E') is. Voor de records waar IsEersteBoeking op 1 staat is dit geen probleem. Dit is altijd een IN-boeking.
Het probleem dat ik heb is het updaten van de kolom InOfUit. Als we pasnummer 1234 als voorbeeld aanhouden is het eerste record een B, het volgende record (van 10:00 uur) een E, het volgende weer een B etc. etc. Voor het updaten van de kolom InOfUit heb ik de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| 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 |
Simpelweg kijkt deze query naar het aantal boekingen tussen het laatste IsEersteBoeking record van het betreffende pasnummer en het betreffende record. Is dit even krijgt het huidige record een 'B', ander een 'E'. Zo krijgende records mooi om en om, op volgorde van de datum, een B en een E. Dit werkt op zich wel, alleen is de query behoorlijk traag bij veel records. Iemand een idee in welke richting ik zou kunnen denken voor een snellere methode?
Overigens zijn de indexen etc. allemaal goed ingesteld, daar hoeven jullie het niet te zoeken.
Oops! Google Chrome could not find www.rijks%20museum.nl