Vra

Ek het die volgende rowwe struktuur:

Object -> Object Revisions -> Data

Die Data kan gedeel word tussen verskeie voorwerpe.

Wat ek probeer doen is om skoon te maak uit ou Object Hersienings. Ek wil die eerste, aktief, en 'n verspreiding van hersiening hou sodat die laaste verandering vir 'n tydperk gehou word. Die Data kan 'n baie oor die verloop van 2 dae dan alleen gelaat vir maande verander, so ek wil die laaste hersiening hou voor die veranderinge begin en die einde verandering van die nuwe stel.

Ek is op die oomblik met 'n wyser en temp tabel om die ID's en datum tussen veranderinge hou sodat ek uit die laag hang vrugte om ontslae te raak van kan kies. Dit beteken die gebruik van @LastID, @LastDate, updates en insetsels om die temp tafel, ens ...

Is daar 'n makliker / beter manier om die datum verskil tussen die huidige ry en die volgende ry in my aanvanklike uitslag stel sonder die gebruik van 'n muis en temp tafel te bereken?

Ek is op SQL Server 2000, maar sou belangstel in enige nuwe kenmerke van 2005, 2008 wat kan help met hierdie so goed.

Was dit nuttig?

Oplossing

As die kolom identiteit is opeenvolgende jy kan hierdie benadering gebruik:

SELECT curr.*, DATEDIFF(MINUTE, prev.EventDateTime,curr.EventDateTime) Duration FROM DWLog curr join DWLog prev on prev.EventID = curr.EventID - 1

Ander wenke

Hier is byvoorbeeld SQL. As jy 'n identiteit kolom, kan jy dit gebruik in plaas van "ActivityDate".

SELECT DATEDIFF(HOUR, prev.ActivityDate, curr.ActivityDate)
  FROM MyTable curr
  JOIN MyTable prev
    ON prev.ObjectID = curr.ObjectID
  WHERE prev.ActivityDate =
     (SELECT MAX(maxtbl.ActivityDate)
        FROM MyTable maxtbl
        WHERE maxtbl.ObjectID = curr.ObjectID
          AND maxtbl.ActivityDate < curr.ActivityDate)

Ek kon "vorige" verwyder, maar het dit daar in die veronderstelling jy ID's uit dit nodig vir die verwydering van.

Hrmm, interessante uitdaging. Ek dink jy kan dit doen sonder om 'n self-sluit as jy die nuwe-to-2005 spilpunt funksie te gebruik.

Hier is wat ek tot dusver het, ek wou dit 'n bietjie meer tyd te gee voordat 'n antwoord te aanvaar.

DECLARE @IDs TABLE 
(
  ID int , 
  DateBetween int
)

DECLARE @OID int
SET @OID = 6150

-- Grab the revisions, calc the datediff, and insert into temp table var.

INSERT @IDs
SELECT ID, 
       DATEDIFF(dd, 
                (SELECT MAX(ActiveDate) 
                 FROM ObjectRevisionHistory 
                 WHERE ObjectID=@OID AND 
                       ActiveDate < ORH.ActiveDate), ActiveDate) 
FROM ObjectRevisionHistory ORH 
WHERE ObjectID=@OID


-- Hard set DateBetween for special case revisions to always keep

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MIN(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MAX(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 
 WHERE ID=(SELECT ID 
           FROM ObjectRevisionHistory 
           WHERE ObjectID=@OID AND Active=1)


-- Select out IDs for however I need them

 SELECT * FROM @IDs
 SELECT * FROM @IDs WHERE DateBetween < 2
 SELECT * FROM @IDs WHERE DateBetween > 2

Ek is op soek na hierdie uit te brei sodat ek kan hou by maksimum so baie weergawes, en snoei van die ouer kinders terwyl hy nog die behoud van die eerste, laaste, en aktief is. Moet maklik genoeg deur kies top en orde deur klousules, um ... en gooi in ActiveDate in die temp tafel wees.

Ek het Peter se voorbeeld te werk, maar het dit en verander dit in 'n subselect. Ek verspeelde om met beide en die sql spoor toon die subselect doen minder lees. Maar dit werk nie en ek sal hom stem wanneer ek my rep hoog genoeg is.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top