Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


grupperingar med fem högsta i sql

Postades av 2001-04-27 12:05:00 - Patrik Löwendahl, i forum databaser, Tråden har 10 Kommentarer och lästs av 660 personer

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.
Nu vill jag på ett tjusigt sätt plocka de fem posterna som har högst datum från varje area.

Ideér ???


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-27 13:28:00 - Christoffer Hedgate

Måste det göras i en SQL sats eller får man använda procedurer etc?

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...


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-27 13:50:00 - Patrik Löwendahl

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 ..


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-27 14:19:00 - Andreas Hillqvist

Tror jag lyckats skapa det sämsta Frågan för att få fram det... :O)
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;


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-27 14:24:00 - Andreas Hillqvist

( Inte direkt nån läs vänlig fråga... :O) )


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-27 15:27:00 - Christoffer Hedgate

Hmm..snygg fråga. :)

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()


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-30 11:34:00 - Christoffer Hedgate

Patrik, har du testat detta? Hur blev isf resultatet? Eller löste du det på något annat sätt?


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-30 12:03:00 - Andreas Hillqvist

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...

DECLARE cur_areas CURSOR
FAST_FORWARD
FOR SELECT area_id FROM area


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-30 13:26:00 - Christoffer Hedgate

hmm..jo, det skulle varit det. Jag skrev det i texten, men när jag skrev ihop cursorn gick det visst lite fort.


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-04-30 16:49:00 - Patrik Löwendahl

select c.* from content c where c.cid in (select top 5 co.cid from content
co where co.aid = c.aid order by co.cid) order by c.aid

funkar fint också :)


Svara

Sv: grupperingar med fem högsta i sql

Postades av 2001-05-02 13:11:00 - Christoffer Hedgate

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.


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 705
27 958
271 751
719
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies