dump van m'n data
Doel: Ik wil de rows selecteren met de hoogste DateFrom, waarbij er gegroepeerd moet worden op NameID.
Het lijkt zo makkelijk, maar ben nu toch al weer een uur bezig, en wil maar niet lukken.
Ik heb zo'n beetje alle vormen van GROUP BY & Having gehad, zitten combineren met INNER en LEFT joins, maar het lukt niet.
Wat nog het dichts in de buurt kwam was deze query:
Dat is 'm bijna, het enige wat ik hier aan zou moeten wijzigen is in die INNER JOIN dit doen: F2.DateFrom=MAX(F1.DateFrom), maar dat mag uiteraard weer niet van MySQL. En subqueries mogen ook nog niet ..
(heb nog geen ver >= 4.1)
De query die ik in eerste instantie gemaakt had is deze:
Die ziet er naar mijn idee nog het beste uit, maar daarbij krijg ik alleen de records met FactorID 11 tm 14 terug. Waarschijnlijk omdat de records met een gelijk NameID en een hoger DateFrom ontbreken. Ik heb dat getest door de data aan te vullen met 4 extra records en dan levert deze query inderdaad niets meer op.
Dit vat ik ook niet helemaal
Heb ook nog geprobeerd de datum hard in te voeren:
Dit levert ook noppes op. Als ik echter van de datum '2003-01-01' of '2002-12-31' maak, dan krijg ik de eerste 14 records. Maak ik er '2003-01-02' van dan krijg ik weer niets.
schiet mij maar lek...
Ik heb dit overigens op een 3.x en een 4.0.13 versie getest
Iemand enig idee hoe ik deze eenvoudig ogende bewerking voor elkaar krijg?
En kan iemand mij misschien ook de logica uitleggen waarom die 2e en 3e query niet werken? (dat die eerste niet werkt snap ik wel)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| FactorID NameID Value DateFrom DateTo 1 1 1.7095 2003-01-01 2003-12-31 2 2 1.7907 2003-01-01 2003-12-31 3 3 1.6669 2003-01-01 2003-12-31 4 4 1.6669 2003-01-01 2003-12-31 5 5 1.26 2003-01-01 2003-12-31 6 6 0.6 2003-01-01 2003-12-31 7 7 3.5 2003-01-01 2003-12-31 8 8 10.48 2003-01-01 2003-12-31 9 9 8 2003-01-01 2003-12-31 10 10 19 2003-01-01 2003-12-31 11 11 NULL 2003-01-01 2003-12-31 12 12 NULL 2003-01-01 2003-12-31 13 13 NULL 2003-01-01 2003-12-31 14 14 NULL 2003-01-01 2003-12-31 15 1 2.7095 2004-01-01 2004-02-01 16 2 2.7907 2004-01-01 NULL 17 3 2.6669 2004-01-01 NULL 18 4 2.6669 2004-01-01 NULL 19 5 2.26 2004-01-01 NULL 20 6 1.6 2004-01-01 NULL 21 7 4.5 2004-01-01 NULL 22 8 11.48 2004-01-01 NULL 23 9 9 2004-01-01 NULL 24 10 20 2004-01-01 NULL |
Doel: Ik wil de rows selecteren met de hoogste DateFrom, waarbij er gegroepeerd moet worden op NameID.
Het lijkt zo makkelijk, maar ben nu toch al weer een uur bezig, en wil maar niet lukken.
Ik heb zo'n beetje alle vormen van GROUP BY & Having gehad, zitten combineren met INNER en LEFT joins, maar het lukt niet.
Wat nog het dichts in de buurt kwam was deze query:
MySQL:
1
2
3
4
| SELECT F1.NameID, MAX(F1.DateFrom) AS maxdate, F2.FactorID FROM Factor AS F1 INNER JOIN Factor AS F2 ON F2.DateFrom=F1.DateFrom AND F2.NameID=F1.NameID GROUP BY F1.NameID |
Dat is 'm bijna, het enige wat ik hier aan zou moeten wijzigen is in die INNER JOIN dit doen: F2.DateFrom=MAX(F1.DateFrom), maar dat mag uiteraard weer niet van MySQL. En subqueries mogen ook nog niet ..
De query die ik in eerste instantie gemaakt had is deze:
MySQL:
1
2
3
4
| SELECT F.*, MAX(F.DateFrom) FROM Factor AS F GROUP BY F.NameID HAVING F.DateFrom=MAX(F.DateFrom) |
Die ziet er naar mijn idee nog het beste uit, maar daarbij krijg ik alleen de records met FactorID 11 tm 14 terug. Waarschijnlijk omdat de records met een gelijk NameID en een hoger DateFrom ontbreken. Ik heb dat getest door de data aan te vullen met 4 extra records en dan levert deze query inderdaad niets meer op.
Dit vat ik ook niet helemaal
Heb ook nog geprobeerd de datum hard in te voeren:
MySQL:
1
2
3
| SELECT F.FactorID, F.NameID, F.DateFrom, F.Value FROM Factor AS F GROUP BY F.NameID HAVING F.DateFrom >= '2004-01-01' |
Dit levert ook noppes op. Als ik echter van de datum '2003-01-01' of '2002-12-31' maak, dan krijg ik de eerste 14 records. Maak ik er '2003-01-02' van dan krijg ik weer niets.
schiet mij maar lek...
Ik heb dit overigens op een 3.x en een 4.0.13 versie getest
Iemand enig idee hoe ik deze eenvoudig ogende bewerking voor elkaar krijg?
En kan iemand mij misschien ook de logica uitleggen waarom die 2e en 3e query niet werken? (dat die eerste niet werkt snap ik wel)