Avatar billede RazzMaTaz Nybegynder
08. august 2013 - 13:19 Der er 9 kommentarer og
1 løsning

View til bestemmelse af min og max interval

Hej Eksperter,

Jeg vil gerne oprette et view som kan fortælle mig hvilket dato interval en anden tabel er filtreret på i en forspørgsel.

Ideen er at jeg har en tidstabel kaldet DIM_TIMER
Den indeholder alle timer i fra 2005 og frem til nu.
Den har desuden nogle kolonner som brugerne kan bruge til at filtre et interval på.

DIM_TIMER
Time (datetime)                  Dato              Uge  Måned Kvartal  År

2013-07-01 00:00:00.000  2013-07-01  27    7          3            2013
2013-07-01 01:00:00.000  2013-07-01  27    7          3            2013
2013-07-01 02:00:00.000  2013-07-01  27    7          3            2013
2013-07-01 03:00:00.000  2013-07-01  27    7          3            2013
2013-07-01 04:00:00.000  2013-07-01  27    7          3            2013

Jeg vil nu gerne lave et view basseret på samme tabel jeg kan joine på TIME og som giver mig min og max for min forspørgsel samt alle timerne udvalgt.

F.eks. en bruger vil gerne filter på dato = 2013-07-01.
Filteret er dynamsik og kan sagtens være på en anden kolonne.

V_MIN_MAX
Time (datetime)                    MIN(datetime)                      MAX(datetime)

2013-07-01 00:00:00.000  2013-07-01 00:00:00.000  2013-07-01 23:00:00.00
2013-07-01 01:00:00.000  2013-07-01 00:00:00.000  2013-07-01 23:00:00.00
2013-07-01 02:00:00.000  2013-07-01 00:00:00.000  2013-07-01 23:00:00.00
...
2013-07-01 23:00:00.000  2013-07-01 00:00:00.000  2013-07-01 23:00:00.00

Jeg har prøvet mig frem med forskellig varianter. Men enten får jeg samtlige værdier DIM_TIMER ellers for jeg min og max til at være det samme som TIME.
Avatar billede Slettet bruger
09. august 2013 - 00:36 #1
Hvad med at bruge Analytic Functions:

select t.*
,min(datetime) over() MinTime
,max(datetime) over() MaxTime
from dim_timer t
where Dato = 2013-07-01
Avatar billede RazzMaTaz Nybegynder
09. august 2013 - 09:34 #2
Hej rahp,

Funktionen gør hvad den skal i dit statement.
Men desværre virker det ikke, når jeg wrapper det i et view.

Problemet er at jeg skal joine videre på min og max datoen.
Så jeg bliver nød til at have det i et view.
Avatar billede Slettet bruger
09. august 2013 - 11:52 #3
Hvis du vil lavet et View med f.eks. min max pr dato kan du skrive:
Min(datetime) over(partitipn by dato)
Avatar billede RazzMaTaz Nybegynder
09. august 2013 - 13:26 #4
Min(datetime) virker ikke/ compiler ikke
Jeg ved ikke om det er fordi jeg er på 2008 R2.
Avatar billede Slettet bruger
09. august 2013 - 13:54 #5
2008r2 er fint. Prøv at vis mig dit statement
Avatar billede RazzMaTaz Nybegynder
12. august 2013 - 12:09 #6
select t.N_TID, MIN(datetime) over (partition by N_TID) as MinTid
from DM.DIM_EL_TID t
where N_DATO = '2013-07-01'
Avatar billede Slettet bruger
12. august 2013 - 12:19 #7
"datetime" skal være dit felt der indeholder time - så måske:
MIN(t.N_TID) over (partition by t.N_TID) as MinTid
Avatar billede Slettet bruger
12. august 2013 - 12:21 #8
og "partition by" skal være på dato:
MIN(t.N_TID) over (partition by t.N_Dato) as MinTid
Avatar billede RazzMaTaz Nybegynder
12. august 2013 - 12:40 #9
Det giver desværre ikke det ønskede resultat.

Max date bliver forkert da der så aggregeres på dato niveau og ikke timer niveau. Desuden ved jeg ikke hvilket niveau der bliver forespurgt på så jeg kan ikke hardcode partition.

hvis jeg efterlader over blank. virker statementet.

Men hvis jeg putter det i et view og sætter where statementet uden på viewet går det galt.

e.g.
--select * from (
select t.N_TID,N_DATO,MIN(t.N_TID) over () as MinTid,MAX(t.N_TID) over () as MaxTid
from DM.DIM_EL_TID t
--)a
where N_DATO = '2013-07-01'

statement virker, men hvis man fjerne kommentarene bliver min og max forkerte.
Avatar billede Slettet bruger
12. august 2013 - 13:00 #10
View dur ikke hvis du ikke ved hvad du skal "partition by" - hvad med at bruge ét statement (i stedet for join på view) v.h.a. WITH AS:

WITH Tider AS
(select *
from DM.DIM_EL_TID t
where  N_DATO = '2013-07-01' --eller hvad bruger vælger som afgr.
)
select t.N_TID,t.N_DATO
,MIN(t.N_TID) over () as MinTid
,MAX(t.N_TID) over () as MaxTid
from Tider t
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

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