ag har två tabeller: area och content. content har en area_id_kolumn som mappar mot area-tabellen. Jag har även en content_date-kolumn i min content-tabell. Måste det göras i en SQL sats eller får man använda procedurer etc? nej inte riktgt .. dessutom e cursors så förbannat långsamt ... tittar lite på att föröska köra en subquery eller två för att få rätt kriterier, men det är klurigt .. Tror jag lyckats skapa det sämsta Frågan för att få fram det... :O) Hmm..snygg fråga. :) Patrik, har du testat detta? Hur blev isf resultatet? Eller löste du det på något annat sätt? Varför inte använda sig av en FAST_FORWARD(Read only, forward only) cursor? Det är väl snabbare än en read only och tar väl mindre resurser... hmm..jo, det skulle varit det. Jag skrev det i texten, men när jag skrev ihop cursorn gick det visst lite fort. select c.* from content c where c.cid in (select top 5 co.cid from content  Antar att du skrev fel, för det måste väl vara ORDER BY co.cid DESC i subqueryn? Hur lång tid tar den? Nu har jag ju inte den riktiga datan utan endast testdata jag skrapat ihop (10000 rader) så andra faktorer kan ju spela in, men med den tar select-frågan 12 sekunder, cursorn tar mindre än 1 sekund. Dock har jag ju inte lagt ner någon tid för att se till att den använder index korrekt eller så. Sen använder ju iofs cursorn en kolumn content_date för att välja senaste, inte id-kolumnen.grupperingar med fem högsta i sql
    
    
Nu vill jag på ett tjusigt sätt plocka de fem posterna som har högst datum från varje area.
Ideér ??? Sv: grupperingar med fem högsta i sql
    
    
Om det får göras i en procedur är det inte så svårt att göra det t ex med nästlade cursors som stoppar in rader i en temptabell, och därefter en select på hela temptabellen. Om det måste göras i ett SQL anrop så kan du ju kapsla in det i en funktion.
Fast det är kanske inte precis en 'snygg' lösning...Sv: grupperingar med fem högsta i sql
    
    Sv: grupperingar med fem högsta i sql
    
    
Join mellan sig själv fyra gånger. Vilket är ineffektivt... 
Men det fungerar. Fast man värdena kolumnvis. 
.. :O)
SELECT content.area_id_kolumn, Max(content.[content_date-kolumn]) AS [MaxOfcontent_date-kolumn], Max(content_1.[content_date-kolumn]) AS [MaxOfcontent_date-kolumn1], Max(content_2.[content_date-kolumn]) AS [MaxOfcontent_date-kolumn2], Max(content_3.[content_date-kolumn]) AS [MaxOfcontent_date-kolumn3], Max(content_4.[content_date-kolumn]) AS [MaxOfcontent_date-kolumn4]
FROM (((content LEFT JOIN content AS content_1 ON (content.[content_date-kolumn] > content_1.[content_date-kolumn]) AND (content.area_id_kolumn = content_1.area_id_kolumn)) LEFT JOIN content AS content_2 ON (content_1.[content_date-kolumn] > content_2.[content_date-kolumn]) AND (content_1.area_id_kolumn = content_2.area_id_kolumn)) LEFT JOIN content AS content_3 ON (content_2.[content_date-kolumn] > content_3.[content_date-kolumn]) AND (content_2.area_id_kolumn = content_3.area_id_kolumn)) LEFT JOIN content AS content_4 ON (content_3.[content_date-kolumn] > content_4.[content_date-kolumn]) AND (content_3.area_id_kolumn = content_4.area_id_kolumn)
GROUP BY content.area_id_kolumn;Sv: grupperingar med fem högsta i sql
    
    
Jo, den fungerar, men som du själv sa, den blir oerhört långsam. Jag testade med 10000 rader, och gav den dessutom perfekt indexering, och då tog frågan 23 sekunder (iofs på min arbetsstation (850 MHz, 1 Gb RAM) men ändå). Och det växer ganska fort med fler rader...
Patrik, vad är det med cursors som är så långsamt? Visst, de är inte det snabbaste man kan hitta, men om man kör fast_forward cursors så är de inga större problem. Räcker förresten med 1 cursor. Följande kod fungerar:
	CREATE TABLE #selecttabell
	(
			area_id					int
		, content_value		varchar(10)
		, content_date		datetime
	)
	DECLARE cur_areas CURSOR
	READ_ONLY
	FOR SELECT area_id FROM area
	
	DECLARE @area_id int
	OPEN cur_areas
	FETCH NEXT FROM cur_areas INTO @area_id
	WHILE (@@fetch_status <> -1)
	BEGIN
		IF (@@fetch_status <> -2)
		BEGIN
			INSERT INTO #selecttabell 
			SELECT TOP 5 area_id, content_value, content_date
			FROM content 
			WHERE area_id = @area_id 
			ORDER BY content_date DESC
		END
		FETCH NEXT FROM cur_areas INTO @area_id
	END
	CLOSE cur_areas
	DEALLOCATE cur_areas
select * from #selecttabell
Och om du vill ha den i en funktion:
CREATE FUNCTION GetLatestContentByArea
()
RETURNS @return_table TABLE 
	(
			area_id					int
		, content_value		varchar(10)
		, content_date		datetime
	)
AS
BEGIN
	DECLARE cur_areas CURSOR
	READ_ONLY
	FOR SELECT area_id FROM area
	
	DECLARE @area_id int
	OPEN cur_areas
	FETCH NEXT FROM cur_areas INTO @area_id
	WHILE (@@fetch_status <> -1)
	BEGIN
		IF (@@fetch_status <> -2)
		BEGIN
			INSERT INTO @return_table 
			SELECT TOP 5 area_id, content_value, content_date
			FROM content 
			WHERE area_id = @area_id 
			ORDER BY content_date DESC
		END
		FETCH NEXT FROM cur_areas INTO @area_id
	END
	CLOSE cur_areas
	DEALLOCATE cur_areas
	RETURN
END
GO
SELECT * FROM GetLatestContentByArea()Sv: grupperingar med fem högsta i sql
    
    Sv: grupperingar med fem högsta i sql
    
    
DECLARE cur_areas CURSOR
   FAST_FORWARD
   FOR SELECT area_id FROM areaSv: grupperingar med fem högsta i sql
    
    Sv: grupperingar med fem högsta i sql
    
    
co where co.aid = c.aid order by co.cid) order by c.aid
funkar fint också :)Sv: grupperingar med fem högsta i sql