Beste Tweakers,
Een korte intro voor wat achtergrond informatie; In de database staan verschillende 'batchID's' de grote van een batch staat in de kolom 'batchSize', elke batch doorloopt de machine die opgedeeld is in een 3 tal units.
Bijvoorbeeld voor batch: X, deze moet de machine in de volgorde van Unit1 -> Unit2 -> Unit3 doorlopen. Wanneer een batch begint aan een unit wordt de 'startTijdUnit' geset, wanneer de batch een unit is doorlopen wordt de 'eindTijdUnit' geset. Een batch is voltooid indien alle drie de units zijn doorlopen. En dus bij elke unit de eindTijdUnit is geset.
In de tabel dbo.unitLog staan alle batchId's die gedraaid zijn en actief zijn. Nu wil ik een berekening doen met de batches die alleen actief zijn! De inhoudt van de tabel ziet er als volgt uit:

Mijn aanpak: (ik heb geprobeerd mijn aanpak zo goed mogelijk te voorzien in de vorm van commentaar)
Door middel van de EXCEPT functie houd ik de actieve batch ID's over:

De queries in de code hierboven heb ik even los toegevoegd aan de code waarvan het resultaat is te zien in de afbeelding. Dit om de werking van de individuele SELECT functies duidelijk te maken. De code hierboven laat alleen het eerste resultaat zien!
Door middel van de ROW_NUMBER functie (kolom: Rij) heb ik een soort van iterator mee kunnen geven aan het resultaat. Alleen kan ik hier niets mee omdat de waarde niet bij 1 begint. Dit is te verklaren door de functies die zijn weergegeven in de afbeelding. Waar is te zien dat batch: 23456 het rijnummer 2 heeft.
Dit gaat helemaal een probleem worden indien er nog meer batches in de database staan, en het resultaat dus niet netjes oploopt.
Ik wil het resultaat dat hier uit komt verder gebruiken. Dus ik heb het batchID nodig.
Ik vermoedt dat dit niet de oplossing is.
Mijn probleem in het kort: Ik wil de actieve batchId('s) overhouden, het liefste in een variabelen zodat ik hem makkelijk beschikbaar heb door middel van bijvoorbeeld een iterator. Maar de batchID('s) mogen ook weggeschreven worden in een tijdelijke tabel. Zodat ik ze hier weer kan uitlezen.
Wat is een goede oplossing wanneer je een situatie als dit hebt, en dus meerdere SELECT functies hebt, hoe kan ik deze resultaten verder in SQL gebruiken?
Ik ben beginnende met SQL dus wellicht niet de grootste uitdaging dit, maar ik heb hier ondertussen al enkele dagen aanbesteedt om dit probleem op te lossen, en kom er maar niet uit, ik denk te veel in array iteraties
.
Een korte intro voor wat achtergrond informatie; In de database staan verschillende 'batchID's' de grote van een batch staat in de kolom 'batchSize', elke batch doorloopt de machine die opgedeeld is in een 3 tal units.
Bijvoorbeeld voor batch: X, deze moet de machine in de volgorde van Unit1 -> Unit2 -> Unit3 doorlopen. Wanneer een batch begint aan een unit wordt de 'startTijdUnit' geset, wanneer de batch een unit is doorlopen wordt de 'eindTijdUnit' geset. Een batch is voltooid indien alle drie de units zijn doorlopen. En dus bij elke unit de eindTijdUnit is geset.
In de tabel dbo.unitLog staan alle batchId's die gedraaid zijn en actief zijn. Nu wil ik een berekening doen met de batches die alleen actief zijn! De inhoudt van de tabel ziet er als volgt uit:

Mijn aanpak: (ik heb geprobeerd mijn aanpak zo goed mogelijk te voorzien in de vorm van commentaar)
SQL:
1
2
3
4
5
6
7
8
9
10
| -- Haal alle batchID's op SELECT DISTINCT batchID AS Resultaat, DENSE_RANK() OVER (ORDER BY batchId) AS Rij1 FROM dbo.unitLog EXCEPT -- Haal alle voltooide batchID's op SELECT DISTINCT TOP(15) batchID, DENSE_RANK() OVER (ORDER BY batchID) AS Rij2 FROM dbo.unitLog WHERE batchID IN (SELECT batchID FROM dbo.unitLog WHERE (eindTijdUnit IS NOT NULL AND unitNummer=@maxNummer AND (aantalGoed+aantalFout)=batchSize)) |
Door middel van de EXCEPT functie houd ik de actieve batch ID's over:

De queries in de code hierboven heb ik even los toegevoegd aan de code waarvan het resultaat is te zien in de afbeelding. Dit om de werking van de individuele SELECT functies duidelijk te maken. De code hierboven laat alleen het eerste resultaat zien!
Door middel van de ROW_NUMBER functie (kolom: Rij) heb ik een soort van iterator mee kunnen geven aan het resultaat. Alleen kan ik hier niets mee omdat de waarde niet bij 1 begint. Dit is te verklaren door de functies die zijn weergegeven in de afbeelding. Waar is te zien dat batch: 23456 het rijnummer 2 heeft.
Dit gaat helemaal een probleem worden indien er nog meer batches in de database staan, en het resultaat dus niet netjes oploopt.
Ik wil het resultaat dat hier uit komt verder gebruiken. Dus ik heb het batchID nodig.
Ik vermoedt dat dit niet de oplossing is.
Mijn probleem in het kort: Ik wil de actieve batchId('s) overhouden, het liefste in een variabelen zodat ik hem makkelijk beschikbaar heb door middel van bijvoorbeeld een iterator. Maar de batchID('s) mogen ook weggeschreven worden in een tijdelijke tabel. Zodat ik ze hier weer kan uitlezen.
Wat is een goede oplossing wanneer je een situatie als dit hebt, en dus meerdere SELECT functies hebt, hoe kan ik deze resultaten verder in SQL gebruiken?
Ik ben beginnende met SQL dus wellicht niet de grootste uitdaging dit, maar ik heb hier ondertussen al enkele dagen aanbesteedt om dit probleem op te lossen, en kom er maar niet uit, ik denk te veel in array iteraties