Toon posts:

[SQL]Query meest recente vergelijken met op een na recente

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben momenteel bezig met een wat lastige query. Het gaat om de volgende tabel:

intOpinieID (PK)
datDatumToegevoegd
intBedrijfID (FK)
intOpinieThemaID (FK)
strOpinie

In deze tabel staan per bedrijf en per thema opinies. Deze worden op onregelmatige basis toegevoegd. Vaak blijft de opinie hetzelfde (drie mogelijkheden) maar soms verandert deze. Juist die veranderingen zijn interessant. Ik ben nu dan ook bezig om een query te maken die per bedrijf en per thema enkel de records teruggeeft van de opinies de verschillen van de voorgaande.

code:
1
2
3
4
5
1   1-1-2000  12  3  SUB
2   1-1-2001  12  3  SUB
3   1-4-2001  12  3  NSI
4   1-1-2002  12  3  NSI
5   1-9-2002  12  3  NOT


Uit dit voorbeeld zouden enkel record 3 en record 5 teruggeven moeten worden. Mijn vraag is of dit met een query te realiseren is of dat daar toch wat programmeerwerk aan te pas moet komen. Mij is het nog niet gelukt om iets werkends te fabriceren. De database engine is Jet (Access).

  • Corona Extra
  • Registratie: September 2003
  • Laatst online: 20-11 15:49
Mischien iets met: select top 2 opinies order by datDatumToegevoegd desc?

Bovenstaande gaat niet werken, je zal het meest recente record vast moeten houden in een buffer. Er komt dus wat programmeerwerk bij kijken.

code:
1
2
3
4
5
6
7
8
9
10
OpinieTabel    lastRecord;

select firstonly from OpinieTabel order by DatumToegevoegd desc where
    OpinieTabel.BedrijdId == lastRecord.BedrijfId &&
    OpinieTabel.OpinieThemeId == lastRecord.OpinieThemeId;

if (OpinieTabel.Opinie != lastRecord.Opinie)
{
    // Hier heb je het laatste record te pakken met een verschillende opinie
}

[ Voor 78% gewijzigd door Corona Extra op 19-11-2006 14:19 . Reden: niet goed gelezen ]


  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

Zo uit mijn hoofd zou ik zeggen dat dit niet gaat lukken, tenzij je met cursors aan de slag gaat. Jet ondersteunt dat echter niet, en je kan dan sowieso net zo goed gaan programmeren. Het is in SQL anders niet mogelijk om records onderling te vergelijken.

Misschien een alternatief idee, waarvan ik niet weet of het reëel is voor je situatie. Je kan in je tabel een extra kolom IsChanged toevoegen, die je vult bij het aanmaken van je record. Dan hoef je alleen maar op die kolom te filteren.

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 01-12 20:47
Het kan nauurlijk wel, als je maar weet wat je wil. Je wilt de opinie opvragen van hetzelfde bedrijf, hetzelfde thema, en de eerste datum ouder dan de huidige opinie. Dat zijn allemaal dingen die je in een WHERE clausule op kunt geven.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
  O1.intOpinieID
 ,O1.datDatumToegevoegd
 ,O1.intBedrijfID
 ,O1.intOpinieThemaID
 ,O1.strOpinie
FROM Opinies AS O1
WHERE strOpinie <> (
  SELECT TOP 1 strOpinie
  FROM Opinies O2
  WHERE
    O1.intBedrijfID = O2.intBedrijfId
    AND O1.intOpinieThemaID = O2.intOpinieThemaID
    AND O2.datDatumToegevoegd < O1.datDatumToegevoegd
  ORDER BY datDatumToegevoegd DESC
)

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

_js_ schreef op zondag 19 november 2006 @ 15:30:
Het kan nauurlijk wel, als je maar weet wat je wil. Je wilt de opinie opvragen van hetzelfde bedrijf, hetzelfde thema, en de eerste datum ouder dan de huidige opinie. Dat zijn allemaal dingen die je in een WHERE clausule op kunt geven.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
  O1.intOpinieID
 ,O1.datDatumToegevoegd
 ,O1.intBedrijfID
 ,O1.intOpinieThemaID
 ,O1.strOpinie
FROM Opinies AS O1
WHERE strOpinie <> (
  SELECT TOP 1 strOpinie
  FROM Opinies O2
  WHERE
    O1.intBedrijfID = O2.intBedrijfId
    AND O1.intOpinieThemaID = O2.intOpinieThemaID
    AND O2.datDatumToegevoegd < O1.datDatumToegevoegd
  ORDER BY datDatumToegevoegd DESC
)
_/-\o_ Daar had ik idd geen seconde aan gedacht.

Verwijderd

Topicstarter
Dank u, dank u! Nette oplossing dit. :)
Pagina: 1