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