Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[T-SQL] select except return

Pagina: 1
Acties:

  • Onno_Devine
  • Registratie: Mei 2005
  • Laatst online: 21:22
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:
Afbeeldingslocatie: http://s8.postimg.org/u0sdabo6d/Schermafbeelding_2014_12_23_om_21_03_37.png

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:
Afbeeldingslocatie: http://s23.postimg.org/7kcjafqt7/Schermafbeelding_2014_12_23_om_20_56_18.png
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 :'( .

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:42
Als alleen de batchId nodig hebt, kan je niet gewoon een group by doen met een max(eindtijd) waar max(eindtijd) null is? Misschien begrijp ik je wel gewoon verkeerd hoor.

Roomba E5 te koop


  • mbaltus
  • Registratie: Augustus 2004
  • Laatst online: 11:02
Dus alleen een overzicht van alle batches die gestart zijn (starttijd is gevuld) en nog niet geeindigd zijn (eindtijd is null). Iets als:

code:
1
SELECT BatchID from dbo.unitLog where startTijdUnit IS NOT NULL and eindTijdUnit IS NULL

The trouble with doing something right the first time is that nobody appreciates how difficult it is