Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 Maby an Challenge for experts or piece of cake

Author  Topic 

Tryan
Starting Member

7 Posts

Posted - 2009-01-19 : 06:05:27
i have 2 table names: BUvitaal and BUgebeurtenis

BUvitaal
columns
vitaalID(int)(primarykey)
invoer(int)
uitvoer(int)
gewicht(int)
etc..

BUgebeurtenis
columns
bewonerID(int)
vitaalID(int)
datum(DateTime)
etc..

Now what i need is every first column value from BUvitaal based on last datum(DateTime) from BUgebeurtenis

i have a select statement here ,but it returns every value from a specific column name based on last datum(DateTime).
and i only need 1 row per column value and it must be te last recent one based on the datum(DateTime) of course.

if a function like FIRST were available in sqlserver 2005 i would have solved this problem easely.

my statement:

select v.vitaalID,v.tekst,v.stoelgang,v.invoer,v.uitvoer,v.gewicht,
v.hogebloed,v.lagebloed,v.pols,v.temperatuur,v.bloedsuiker,
v.tijd,v.lengte,v.zichtbaar
from BUvitaal v
INNER JOIN BUgebeurtenis g
ON v.vitaalID = g.vitaalID
where g.datum <= ANY
(SELECT Max(gg.datum) from BUgebeurtenis gg where gg.datum <= Getdate() and vitaalID <> 0
and gg.bewonerID = 5)
order by datum desc

results are:

[url]http://www.box.net/shared/tmxfacnfg2[/url]

the green rows are the ones i need

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-01-19 : 06:33:01
There is a "first" function in SQL Server 2005. It's called ROW_NUMBER()



E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-01-19 : 06:36:13
You can also use CROSS APPLY.
Visakh will show you shortly.



E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

Tryan
Starting Member

7 Posts

Posted - 2009-01-19 : 06:42:11
Great! can't wait :)
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-01-19 : 07:51:55
Meanwhile, try this
DECLARE	@Stage TABLE
(
rowID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
grp tinyint,
vitaalID,
tekst,
stoelgang,
invoer,
uitvoer,
gewicht,
hogebloed,
lagebloed,
pols,
temperatuur,
bloedsuiker,
tijd,
lengte,
zichtbaar
)

INSERT @Stage
(
vitaalID,
tekst,
stoelgang,
invoer,
uitvoer,
gewicht,
hogebloed,
lagebloed,
pols,
temperatuur,
bloedsuiker,
tijd,
lengte,
zichtbaar
)
select v.vitaalID,
v.tekst,
v.stoelgang,
v.invoer,
v.uitvoer,
v.gewicht,
v.hogebloed,
v.lagebloed,
v.pols,
v.temperatuur,
v.bloedsuiker,
v.tijd,
v.lengte,
v.zichtbaar
from BUvitaal as v
INNER JOIN BUgebeurtenis as g ON v.vitaalID = g.vitaalID
where g.datum <= (SELECT Max(gg.datum) from BUgebeurtenis as gg where gg.datum <= Getdate() and vitaalID <> 0 and gg.bewonerID = 5)
order by datum desc

DECLARE @left TINYINT,
@right TININT

SELECT @left = 0,
@right = 0

UPDATE grp = CASE
WHEN @left = 0 AND invoer > 0 AND uitvoer > 0 THEN 1
WHEN @right = 0 AND hogebloed > 0 AND lagebloed > 0 THEN 1
ELSE 0
END,
@left = case when invoer > 0 AND uitvoer > 0 then 1 else 0 end,
@right = case when hogebloed > 0 AND lagebloed > 0 then 1 else 0 end

SELECT vitaalID,
tekst,
stoelgang,
invoer,
uitvoer,
gewicht,
hogebloed,
lagebloed,
pols,
temperatuur,
bloedsuiker,
tijd,
lengte,
zichtbaar
FROM @Stage
WHERE grp = 0



E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-19 : 09:14:11
using ROW_NUMBER()

SELECT vitaalID,tekst,stoelgang,invoer,uitvoer,gewicht,
hogebloed,lagebloed,pols,temperatuur,bloedsuiker,
tijd,lengte,zichtbaar
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY vitaalID ORDER BY datum DESC) AS Seq,
v.vitaalID,v.tekst,v.stoelgang,v.invoer,v.uitvoer,v.gewicht,
v.hogebloed,v.lagebloed,v.pols,v.temperatuur,v.bloedsuiker,
v.tijd,v.lengte,v.zichtbaar
from BUvitaal v
INNER JOIN BUgebeurtenis g
ON v.vitaalID = g.vitaalID
)t
WHERE t.Seq=1
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-19 : 09:20:51
using CROSS APPLY

SELECT v.vitaalID,v.tekst,v.stoelgang,v.invoer,v.uitvoer,v.gewicht,
v.hogebloed,v.lagebloed,v.pols,v.temperatuur,v.bloedsuiker,
v.tijd,v.lengte,v.zichtbaar
FROM BUvitaal v
CROSS APPLY (SELECT TOP 1 *
FROM BUgebeurtenis
WHERE vitaalID = v.vitaalID
ORDER BY datum DESC) g
Go to Top of Page

Tryan
Starting Member

7 Posts

Posted - 2009-01-20 : 00:55:49
i thank you for the quick reply ,but sql server doesn't recoqnize Row_number() for some reason.
i have sql server 2005 standard edition and the function isn't available can anyone explain that to me?
and "using row_number()" using isn't working.
USE instead is recoqnized.
Go to Top of Page

SwePeso
Patron Saint of Lost Yaks

30421 Posts

Posted - 2009-01-20 : 02:17:16
You must set your compatibility level to 90 or higher for the current database.


E 12°55'05.63"
N 56°04'39.26"
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-20 : 02:26:19
use
EXEC sp_dbcmptlevel 'your db name',90

for that
Go to Top of Page

Tryan
Starting Member

7 Posts

Posted - 2009-01-22 : 12:59:23
ok i set dbcmptlevel to 90
,but still it doesn't recoqnize ROW_NUMBER() feature.

and the query won't execute :(
Go to Top of Page

visakh16
Very Important crosS Applying yaK Herder

52326 Posts

Posted - 2009-01-22 : 13:05:37
the query is this:-


SELECT vitaalID,tekst,stoelgang,invoer,uitvoer,gewicht,
hogebloed,lagebloed,pols,temperatuur,bloedsuiker,
tijd,lengte,zichtbaar
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY vitaalID ORDER BY datum DESC) AS Seq,
v.vitaalID,v.tekst,v.stoelgang,v.invoer,v.uitvoer,v.gewicht,
v.hogebloed,v.lagebloed,v.pols,v.temperatuur,v.bloedsuiker,
v.tijd,v.lengte,v.zichtbaar
from BUvitaal v
INNER JOIN BUgebeurtenis g
ON v.vitaalID = g.vitaalID
)t
WHERE t.Seq=1


or this:-


SELECT v.vitaalID,v.tekst,v.stoelgang,v.invoer,v.uitvoer,v.gewicht,
v.hogebloed,v.lagebloed,v.pols,v.temperatuur,v.bloedsuiker,
v.tijd,v.lengte,v.zichtbaar
FROM BUvitaal v
CROSS APPLY (SELECT TOP 1 *
FROM BUgebeurtenis
WHERE vitaalID = v.vitaalID
ORDER BY datum DESC) g



the others were just headings i put
Go to Top of Page

Tryan
Starting Member

7 Posts

Posted - 2009-01-27 : 04:34:20
excel: http://www.box.net/shared/8kk0d6m3is

are the results from the first query in the previous reply. (and the second one didn't work as it should be too)

what i need are only the green one's marked ,should be 6 or 7 rows.

please reply.



Go to Top of Page
   

- Advertisement -