Avatar billede pfp Nybegynder
30. april 2008 - 14:55 Der er 5 kommentarer og
1 løsning

Find nyeste version af alle rækker

Hej.

Jeg har en tabel med følgende skema:

[ID] int
[LineNumber] int
[Year] int
[Value] float
[Version] int
[AnalysisID] int


Data kunne se sådan her ud:

ID | LineNumber | Year | Value | Version | AnalysisID
------------------------------------------------------
101  1          1990    10      1          1001
102  2          1991    20      1          1001
103  3          1992    30      1          1001
104  4          1993    40      1          1001
105  5          1994    50      1          1001
106  3          1992    45      2          1002
107  4          1993    55      2          1002


Dvs. hver gang værdierne tilknytet AnalysisID bliver sat ind i tabellen får de et inkrementeret versionsnummer.

Nu vil jeg så gerne hente de nyeste rækker ud for hver [LineNumber]. Altså IKKE kun alle med højeste versionsnummer

(her 2), men alle med højeste versionsnummer respektivt.

Resultatet af en korrekt forespørgsel vil blive:

ID | LineNumber | Year | Value | Version | AnalysisID
------------------------------------------------------
101  1          1990    10      1          1001
102  2          1991    20      1          1001
105  5          1994    50      1          1001
106  3          1992    45      2          1002
107  4          1993    55      2          1002

Rækkerne med ID = 103 og 104 skal altså væk fordi de netop de rækker også findes med højere versionsnummer.

Jeg har prøvet en del forskelligt, seneste med nedenstående, som dog desværre bare returnerer samtlige rækker:

SELECT
          [ACEID],
          [LineNumber],
          [Year],
          [Value],
          [Version],
          [AnalysisID]
FROM
          [ACE2]
WHERE
          [Version]
IN
          (
          SELECT MAX([Version]) FROM [ACE2]
          GROUP BY [Version]
          )

Jeg håber der en der har mod på kort at hjælpe mig videre med problemet.

På forhånd tak.

/pfp
Avatar billede HenrikSjang Nybegynder
30. april 2008 - 17:40 #1
Hvis du kører SQL 2005, bør dette kunne gøre det:

WITH aCTE
AS
(
SELECT
  ROW_NUMBER() OVER(PARTITION BY LineNumber ORDER BY Version DESC) AS RowNumber,
  *
)

SELECT * FROM aCTE
WHERE RowNumber = 1

Jeg har i overstående gået ud fra, at year, value og de andre id'er er underordnede. Så det der returneres, er præcis én række for hver LineNumber id, og det er så den række med højeste version.
Hvis IKKE du kører SQL 2005, så kan du ikke bruge ovenstående.
Avatar billede pfp Nybegynder
30. april 2008 - 20:11 #2
Hej sjang.

Jeg kører SQL Server 2005. Jeg håber jeg kan nå at teste det i aften, så vender jeg tilbage.

Tak indtil videre.
Avatar billede pfp Nybegynder
30. april 2008 - 21:58 #3
Hej igen.

Det virkede helt fint, der manglede bare lige en FROM clause inden SELECT nr. 2.

Jeg har et tillægsspørgsmål, hvis det er OK med dig (sig til hvis det er bedre med et nyt spm.)

Ovenstående giver nyeste versionerede resultatsæt. Når der indsættes værdier bundet til AnalysisID vil det som tidligere beskrevet resultere i et højere versionsnummer.

Derfor virker ovenstående fint når jeg vil hente det senest opdaterede resultatsæt. Men hvordan kan det gribes an hvis jeg derefter gerne vil se hvordan sættes så ud i et bestemt stadie.

F.eks. vil jeg gerne kunne komme med en AnalysisID og får retur hvordan data så ud med den version der var højest da AnalysisID blev indsat.

Hvis vi forestiller os at der var kommet en ny version med data i version 3 og jeg gerne ville se ud da AnalysisID = 1002 var den nyeste.

Der ville den så stadig skulle returnere ID 101, 102, 105, 106, 107 men ikke 108 og 108 som ville være nyere end de data der var tilgængelige data AnalysisID = 1002 var den nyeste.

Jeg håber spørgsmålet giver mening, det er sgu lidt kringlet at forklare ;-)

/pfp
Avatar billede HenrikSjang Nybegynder
02. maj 2008 - 09:21 #4
Jeg er ikke helt sikker på at jeg forstår. Du skriver "Når der indsættes værdier bundet til AnalysisID vil det som tidligere beskrevet resultere i et højere versionsnummer.". Mener du ikke, at det er når man indsætter rækker med samme LineNumber værdi, at versionsnummeret så stiger?
Jeg synes jo at der er flere forskellige AnalysisID'er, med samme versionsnr.

Har version og analysisId noget med hinanden at gøre, eller er det "tilfældigt" at når versionen er 1, så er analysisid 1001 osv?
Avatar billede pfp Nybegynder
17. maj 2008 - 14:15 #5
Jeg tror umiddelbart at jeg har fået det til at spille med dit første forslag alene.

Beklager at jeg først vender tilbage nu.

Du skal have mange tak for hjælpen.

Smider du et svar?
Avatar billede HenrikSjang Nybegynder
17. maj 2008 - 14:54 #6
svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester