Alles archiveren... behalve laatste 15 records

Status
Niet open voor verdere reacties.

jbusser

Gebruiker
Lid geworden
23 feb 2007
Berichten
184
Hallo,
Is er een mogelijkheid, bijvoorbeeld een bijwerkquery, waarmee het volgende kan worden bewerkstelligd:
Het gaat om twee tabellen: één tabel bevat persoonsinformatie, de gerelateerde tabel bevat statussen van deze personen
Nu wordt de database wel erg grootg en sommige personen hebben meer dan 100 status-entrys.
Echter, alleen de laatste 15 entry's zijn, normaal gesproken, van belang.
Nu wil ik dus een query laten lopen en val alle personen alle statussen, behalve de laatste 15, kopieren naar een achieftabel.
Dat verplaatsten naar een archieftabel lukt me wel maar de selectie van die laatste 15 weet ik niet hoe dat aan te pakken.
Wie-o-wie helpt mij
Alvast bedankt!
 
Mogelijke T-SQL query om degene die ouder zij dan de laatste 15 te krijgen:
Code:
with qry1 (ID, F1, …, DateStatus , Status, Statusrank) as(
SELECT ID, F1, … , Date1, row_number() OVER(PARTITION BY F1 order by Date1 desc) as RankOrder
FROM MyTable)

delete from MyTable where ID not in(select ID from qry1 where Statusrank >= 15 )


Of als deze query niet wekt in het Access dialect van SQL:
- voeg een veld isActive toe (bit)
- maak een query per klant: sorteer aflopend op het datumveld en neem de TOP 15 lijnen, en maak daar een update query van die het veld isactive op 1 zet
- nadat alle klanten geupdated zijn: archiveer alle lijnen waar isactive 0 of NULL is
 
Als je (aflopend) kunt sorteren op datum of op een autonummerveld, is het niet zo lastig om de records te vinden, en eventueel te markeren als je daar een extra veld voor hebt. Als je ze met je bijwerkquery eerst markeert, dan kun je ze daarna makkelijk toevoegen aan je archieftabel op basis van dat veld, en vervolgens verwijderen.
Code:
SELECT tblStatus.KlantID, tblStatus.Datum, tblStatus.StatusID
FROM tblStatus
WHERE tblStatus.StatusID IN
   (SELECT TOP 3 StatusID                            
   FROM tblStatus AS Dupe                              
   WHERE Dupe.KlantID = tblStatus.KlantID        
   ORDER BY Dupe.Datum DESC, Dupe.StatusID DESC) 
ORDER BY tblStatus.KlantID, tblStatus.Datum, tblStatus.StatusID;
Zou moeten werken voor de selectie.
 
Door de vreemde situatie in de wereld momenteel en werkzaamheden in het ziekenhuis heb ik nog niet de tijd gehad e.e.a. uitgebreid te testen en te implementeren.
Ik denk dat de SQL instructie van Octafish voor mij het best te behappen is. Alvast bedankt, ik laat weten wat het uiteindelijk geworden is...
 
Succes, het zijn dan drukke tijden voor je!
 
Oké Octafisch, ontzettend bedankt: Dit is uiteindelijk de SQL instructie geworden:

UPDATE D SET Kaarten.Archive = True
WHERE (((Kaarten.ID) In (SELECT TOP 5 ID
FROM Kaarten AS Dupe
WHERE Dupe.Persoon= Kaarten.Persoon
ORDER BY Dupe.datum DESC, Dupe.ID DESC)));

Werkt Prima (op basis van een aangevinkt Archive-veld kan ik gemakkelijk verder...
Thanx
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan