webForumDet fria alternativet

MS SQL komma ihåg värdet från föregående rad och hämta värdet från nästa rad...

Databaser & SQL

5 svar · 524 visningar · startad av CatZ

Medlem sedan jan. 20022 440 inlägg
Frågan#1

Jag har en fråga som är lite knepig... Jag har en selectsats som kollar lite statistik på besökarna. Besöksdatum, nedladdningsdatum osv.

Nu behöver jag jämföra datumen inne i frågan och filtrera ut de som inte ska vara där. I reporting services kan man göra:

=IIF(Previous(Fields!DownloadDate.Value) = Fields!DownloadDate.Value, "", Fields!DownloadDate.Value)

Fast jag behöver göra tvärtom alltså måste jag in och ändra i min view. :)

select 
	table1.col
	,table1.[date]
	,(select max(table2.[date])
             from table2
            where table2.[date] < table1.[date]
                and table1.id = table2.id)
from table1 
order by table1.[date] desc

fungerar utmärkt, tack LarsG. Enda problemet nu är att jag får dubbla värden från table2.[date] om det inte finns något max värde förutom ett som redan använts kommer det återanvändas för varje rad och det är inte rätt :(

I en av rapporterna jag skapat i Reporting Services kan jag göra

=IIF(Previous(Fields!DownloadDate.Value) = Fields!DownloadDate.Value, "", Fields!DownloadDate.Value)

vilket bara gömmer det värdet men i en annan rapport måste jag gå åt andra hållet och det finns ingen Next(Fields!Name.Value).

Jag ser inte någon lösning på problemet, kan man använda temporära varabeltabeller istället?

Medlem sedan jan. 20022 440 inlägg
#2

Såhär fungerar det hmm

VisitDate ska vara mindre än DownloadDate men om nästa VisitDate för samma kundID är större fast och DownloadDate fortfarande är större än VisitDate ska DownloadDate placeras på denna raden istället. Kan man lösa det utan att använda datum-"range"?

Datan hämtas från olika databaser.

Medlem sedan jan. 20022 440 inlägg
#3

Kolla på bilden, och kolumnen till höger så ser ni att jag får med dubletter som egentligen inte är relaterade till den raden. Den översta av dubbletterna ska vara där men de som kommer sedan ska bort.

få bort dubbletter.png
Medlem sedan dec. 200012 464 inlägg
#4

Hmm, jag förstår inte vad du är ute efter.

Kan du ge lite exempel på innehåll i table1, table2 och förväntat resultat?

Medlem sedan jan. 20022 440 inlägg
#5

Innehåll i table1 är besökarens useragent samt datum för besök.
ex:

htc_touch_pro 	2008-11-15 23:33:34			2008-11-14 23:34:00
nokia_n70-1	2008-11-15 15:30:31			NULL

Så långt allt väl MEN om samma användare besöker sidan två gånger och klickar på ladda ner senaste tillfället han besöker sidan så får jag följande resultat:

htc_touch_pro 	2008-11-15 00:00:00			2008-11-14 00:01:00
htc_touch_pro 	2008-11-15 23:33:34			2008-11-14 00:01:00

Jag vill alltså inte visa dubbletterna från table2. Förväntat resultat är:

htc_touch_pro 	2008-11-15 00:00:00			2008-11-14 00:01:00
htc_touch_pro 	2008-11-15 23:33:34			NULL

Det kommer bli mer komplicerat än så för det är fler datum och nästa datum ska jämföras datumet innan i händelsekjedjan men det kan vi strunta i så länge.

Medlem sedan jan. 20022 440 inlägg
#6

Det går inte, det får bli i rapporten istället. Oavsett vilket så är det ju affärslogik som inte hör hemma alls i min vy.

298 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
169 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)