Partager via


Ranking Functions, TOP and Aggregates

This is something I came across a few times within the last few weeks so thought I’d share the findings:

You probably heard about ranking functions by now. However you may have a missed this great benefit ranking functions bring to easing a complex scenario: Combine TOP functionality with aggregations. Example; getting something like “top 3 most popular songs every day” out of the “requests” table on a jukebox can be challenging on a large table. Details follow: Assume a table with the following schema. This table records every individual requests played on the jukebox.

create table weblog.requests(

      id int identity primary key,

songid nvarchar(128) not null,

reqdate datetime default (getdate())

)

go

Clearly, there are other ways to do this. But a new a simpler way to do this would the following query:

WITH TopRequests(ROWNUM, REQCOUNT, SONGS, REQDAY)

AS

(

   SELECT ROW_NUMBER()

OVER (PARTITION BY datepart(dd,reqdate)

      ORDER BY datepart(dd,reqdate), COUNT(*) desc, songid) as [ROWNUM],

      COUNT(*) as [REQCOUNT],

      songid as [SONGS],

   DATEPART(dd,reqdate) as [REQDAY]

   FROM weblog.requests

   GROUP BY DATEPART(dd,reqdate), songid

)

SELECT REQDAY, SONGS, REQCOUNT

FROM TopRequests

WHERE ROWNUM<4

ORDER BY REQDAY, REQCOUNT desc, SONGS

Comments

  • Anonymous
    January 16, 2005
    I assume this isn't your SQL 2000 server, correct?
  • Anonymous
    January 17, 2005
    This is all SQL Server 2005.
  • Anonymous
    May 23, 2008
    This is something I came across a few times within the last few weeks so thought I’d share the findings: You probably heard about ranking functions by now. However you may have a missed this great benefit ranking functions bring to easing a complex scenario
  • Anonymous
    June 01, 2009
    PingBack from http://paidsurveyshub.info/story.php?id=74502