anoniem Geplaatst: 17 april 2003 Delen Geplaatst: 17 april 2003 Zo: ik heb ook eens een vraag ;) Ik ben bezig met een systeem dat simpelweg bestaat uit een aantal sensoren en een aantal metingen (die dus bestaat uit een sensorID en een waarde). Nu wil ik ontbrekende data detecteren, maar ik zie door de UNION's het bos niet meer... Situatie: een klant heeft een bepaald aantal sensoren, laat ik zeggen twee van type 1, één van type 2 en één van type 3. Nu komt er een meting binnen die bestaat uit 2 twee records: dat zijn er dus 2 te weinig (de klant heeft immers 4 sensoren). Het detecteren dat het er te weinig zijn is geen probleem, maar ik wil natuurlijk detecteren wélke sensoren er percies niet verwerkt zijn. Simpelweg bestaat mijn de setup tabel (afgezien van klantID's etc etc) uit de volgende waarden: 1,2,1,3 (2 sensoren type 1, 1 sensor type 2 en 1 sensor type 3) en de metingentabel (althans: de sensorID's) uit de waarden: 1,2 (om maar een voorbeeld te geven). Ik probeer dus nu een query te maken die teruggeeft dat ik bij die meting 1 maal een sensor van type 1 mis en 1 maal een sensor van type 3. Dat die type 3 er niet inzit lukt me nog wel, maar type 1 zit wel in de resultaten, maar slechts 1 maal. En daar zit dus het probleem: hoe dit te detecteren? Als ik een UNION gebruik komt er dus alleen die type 3 uit, type 1 is immers wel aanwezig... Wie helpt? Quote Link naar reactie
anoniem Geplaatst: 18 april 2003 Auteur Delen Geplaatst: 18 april 2003 Bill, post even de structuur van de tabellen van waaruit je de gegevens wilt ophalen. In pricipe is het namelijk niet zo moeilijk, maar kan moeilijk even iets uit me hoofd doen zonder dat ik een datamodel voor me zie. Greetz, Taz Quote Link naar reactie
anoniem Geplaatst: 18 april 2003 Auteur Delen Geplaatst: 18 april 2003 Gebruik overigens zo min mogelijk unions. Is vaak absoluut niet nodig... Quote Link naar reactie
anoniem Geplaatst: 18 april 2003 Auteur Delen Geplaatst: 18 april 2003 Ow jee: nu moet ik dus proberen phpBB wijs te maken hoe mijn tabellen eruit zien ;) Ik doe het overigens even erg simplistisch: er zijn wel wat meer kolommen aanwezig in de tabellen, maar die worden in dit geval toch niet gebruikt. customerSetup: [code:1:1a3c502403]customerID sensorID 1 1 1 2 1 1 1 3[/code:1:1a3c502403] data: [code:1:1a3c502403]customerID [time] sensorID measurement 1 x 2 10 1 x 1 5 [/code:1:1a3c502403]Ter verduidelijking: klant 1 heeft dus 4 sensoren (type 1 twee maal, type 2 één maal en type 3 ook eenmaal) en bij een meting op tijdstip "x" komen er maar 2 sensoren binnen: é6n van type 1 en één van type 2. Er ontbreekt dus é6n sensor van type 1 en é6n sensor van type 3. Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 [quote:6fbd5f10dc="Bill Gates"]Ow jee: nu moet ik dus proberen phpBB wijs te maken hoe mijn tabellen eruit zien ;) Ik doe het overigens even erg simplistisch: er zijn wel wat meer kolommen aanwezig in de tabellen, maar die worden in dit geval toch niet gebruikt. customerSetup: [code:1:6fbd5f10dc]customerID sensorID 1 1 1 2 1 1 1 3[/code:1:6fbd5f10dc] data: [code:1:6fbd5f10dc]customerID [time] sensorID measurement 1 x 2 10 1 x 1 5 [/code:1:6fbd5f10dc]Ter verduidelijking: klant 1 heeft dus 4 sensoren (type 1 twee maal, type 2 één maal en type 3 ook eenmaal) en bij een meting op tijdstip "x" komen er maar 2 sensoren binnen: é6n van type 1 en één van type 2. Er ontbreekt dus é6n sensor van type 1 en é6n sensor van type 3.[/quote:6fbd5f10dc] [code:1:6fbd5f10dc] SELECT DISTINCT d.customerId, d.myTime,cs.sensorId FROM data AS d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId WHERE (d.sensorId <> cs.sensorId) ORDER BY d.CustomerId,d.myTime,cs.sensorId [/code:1:6fbd5f10dc] Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 Dat werkt (helaas) niet. Ik krijg nu als resultaat:[code:1:69aac08a2a]customerID [time] sensorID 1 x 1 1 x 2 1 x 3[/code:1:69aac08a2a] Nog steeds niet goed dus :cry: Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 [quote:7b5c9577c1="Bill Gates"]Dat werkt (helaas) niet. Ik krijg nu als resultaat:[code:1:7b5c9577c1]customerID [time] sensorID 1 x 1 1 x 2 1 x 3[/code:1:7b5c9577c1] Nog steeds niet goed dus :cry:[/quote:7b5c9577c1] Komt sensorId uit de customerSetup of de data tabel? Wat is [time] voor een veld en wat voor waarden staat daar in? Wat leveren onderstaande queries als resultaat op (om te testen)? [code:1:7b5c9577c1] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId [/code:1:7b5c9577c1] [code:1:7b5c9577c1] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId WHERE (d.sensorId <> cs.sensorId) [/code:1:7b5c9577c1] Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 [quote:4ad52f9805]Komt sensorId uit de customerSetup of de data tabel?[/quote:4ad52f9805]Het is eigenlijk gewoon een Foreign Key naar een andere tabel (die heel verassend "sensors" heet). Maar dat is niet zo interessant nu, alleen bij het toevoegen van records is dat van belang. [quote:4ad52f9805]Wat is [time] voor een veld en wat voor waarden staat daar in?[/quote:4ad52f9805]Dat is een "datetime" veld met de datum en tijd waarop de meting uitgevoerd is. [quote:4ad52f9805] Wat leveren onderstaande queries als resultaat op (om te testen)? [code:1:4ad52f9805] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId [/code:1:4ad52f9805] [/quote:4ad52f9805] [code:1:4ad52f9805] 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 2 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 3 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 2 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 3 [/code:1:4ad52f9805](customerID, [time], sensorID, measurement, customerID, sensorID) [quote:4ad52f9805] [code:1:4ad52f9805] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId WHERE (d.sensorId <> cs.sensorId) [/code:1:4ad52f9805][/quote:4ad52f9805][code:1:4ad52f9805]1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 3 1 2003-04-19 15:15:00.000 1 5 1 2 1 2003-04-19 15:15:00.000 1 5 1 3[/code:1:4ad52f9805](customerID, [time], sensorID, measurement, customerID, sensorID) Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 Wat maakt phpBB er toch een zooitje van :roll: Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 [quote:6e6cbfad1b="Bill Gates"][quote:6e6cbfad1b]Komt sensorId uit de customerSetup of de data tabel?[/quote:6e6cbfad1b]Het is eigenlijk gewoon een Foreign Key naar een andere tabel (die heel verassend "sensors" heet). Maar dat is niet zo interessant nu, alleen bij het toevoegen van records is dat van belang. [/quote:6e6cbfad1b] Ik bedoelde met sensorId het resultaat van de query. [quote:6e6cbfad1b="BillGates"] [quote:6e6cbfad1b] Wat leveren onderstaande queries als resultaat op (om te testen)? [code:1:6e6cbfad1b] SELECT d.*, cs.* FROM data d LEFT JOIN customerSetup cs ON d.customerId=cs.customerId [/code:1:6e6cbfad1b] [/quote:6e6cbfad1b] [code:1:6e6cbfad1b] 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 2 1 2003-04-19 15:15:00.000 2 10 1 1 1 2003-04-19 15:15:00.000 2 10 1 3 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 2 1 2003-04-19 15:15:00.000 1 5 1 1 1 2003-04-19 15:15:00.000 1 5 1 3 [/code:1:6e6cbfad1b](customerID, [time], sensorID, measurement, customerID, sensorID) [/quote:6e6cbfad1b] [code:1:6e6cbfad1b] SELECT DISTINCT d1.CustomerId, d1.[Time], cs.SensorId FROM data d1 LEFT JOIN customerSetup cs ON d1.CustomerId=cs.customerId WHERE cs.sensorId NOT IN ( SELECT d2.sensorId FROM data d2 WHERE d1.[Time]=d2.[Time] ) [/code:1:6e6cbfad1b] Zelf ff optimaliseren indien dat (eventueel) nog nodig mocht zijn... Waarom gebruik je trouwens [color=red:6e6cbfad1b]time[/color:6e6cbfad1b] als veldnaam? Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 [quote:e540e419ae="h4xX0r"][code:1:e540e419ae] SELECT DISTINCT d1.CustomerId, d1.[Time], cs.SensorId FROM data d1 LEFT JOIN customerSetup cs ON d1.CustomerId=cs.customerId WHERE cs.sensorId NOT IN ( SELECT d2.sensorId FROM data d2 WHERE d1.[Time]=d2.[Time] ) [/code:1:e540e419ae][/quote:e540e419ae]Dit is dus het probleem dat ik in het begin van de topic schetste, er komt nu dit uit:[code:1:e540e419ae]customerID [time] sensorID 1 2003-04-19 15:15:00.000 3[/code:1:e540e419ae]Nu mis ik dus dat er maar één sensor van type 1 aanwezig was en in de setup van die klant zijn er twee van type 1. En laat ik dat nou net willen detecteren ;) [quote:e540e419ae="h4xX0r"]Waarom gebruik je trouwens [color=red:e540e419ae]time[/color:e540e419ae] als veldnaam?[/quote:e540e419ae]Oude gewoonte ;) Quote Link naar reactie
anoniem Geplaatst: 19 april 2003 Auteur Delen Geplaatst: 19 april 2003 [quote:e6829aea60="Bill Gates"]Dit is dus het probleem dat ik in het begin van de topic schetste, er komt nu dit uit:[code:1:e6829aea60]customerID [time] sensorID 1 2003-04-19 15:15:00.000 3[/code:1:e6829aea60]Nu mis ik dus dat er maar één sensor van type 1 aanwezig was en in de setup van die klant zijn er twee van type 1. En laat ik dat nou net willen detecteren ;)[/quote:e6829aea60] Zeg dat dan meteen. 8) [code:1:e6829aea60] SELECT DISTINCT d1.CustomerId, d1.[Time], cs.SensorId FROM data AS d1 LEFT JOIN customerSetup AS cs ON d1.CustomerId=cs.customerId WHERE cs.sensorId NOT IN ( SELECT d2.sensorId FROM data d2 WHERE (d1.[Time]=d2.[Time]) ) OR cs.sensorID IN ( SELECT d3.sensorId FROM data d3 GROUP BY d3.customerId,d3.[Time],d3.sensorId HAVING count(sensorId) <> ( SELECT count(*) FROM customerSetup cs2 WHERE (cs2.sensorId = d3.sensorId) AND (cs2.customerId = d3.customerId) ) AND (d1.customerId=d3.customerID) AND (d1.[Time]=d3.[Time]) ) [/code:1:e6829aea60] Dit kan vast efficiënter :) Er wordt in dit geval geen onderscheid gemaakt in de hoeveelheid ontbrekende data per type sensor. Quote Link naar reactie
anoniem Geplaatst: 12 mei 2003 Auteur Delen Geplaatst: 12 mei 2003 zal er later vandaag even naar kijken. Ben drie weken weg geweest greetz, Taz Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen