如何获得每个类别的前10个项目

时间:2012-07-01 20:51:24

标签: sql sql-server sql-server-2008

使用SQL Server 2005/2008我有一个表BB_MEDIAOBJECT (Id, ...),其中包含mediaobjects的其他几个数据字段,一个表BB_COLLECTION (Id, Name, Description),其中定义了大约30个集合,以及表BB_MEDIAOBJECT_COLLECTION (MediaObjectId, CollectionId),列出每个集合中的所有项目。

请帮我定义一个SQL查询,为每个集合提供前10个mediaobjects

根据Marc提供的答案,我最终得到了以下最终结果,其中查询现在可以正确显示最近修改的10个项目:

;WITH PartitionedComponents AS  
(  
    SELECT  
        CollectionID = c.ID,  
        c.Name,  
        c.Description, 
        MediaObjectId = m.ID, 
        ROW_NUMBER() OVER(PARTITION BY c.ID ORDER BY m.modifiedby DESC) AS 'RowNum' 
    FROM  
        dbo.BEELDBANK_COLLECTION c 
    INNER JOIN 
        dbo.BEELDBANK_MEDIAOBJECT_COLLECTION mc ON mc.CollectionId = c.ID 
    INNER JOIN 
        dbo.BEELDBANK_MEDIAOBJECT m ON mc.MediaObjectId = m.Id 
) 
SELECT  
    CollectionID,  
    Name,  
    Description, 
    MediaObjectId 
FROM  
    PartitionedComponents 
WHERE 
    RowNum <= 10

1 个答案:

答案 0 :(得分:2)

一种方法是使用CTE(公用表表达式)。您可以按照某些条件对数据进行分区 - 即集合的Id - 并为每个分区的SQL Server编号所有行开始,按其他一些条件排序 - 即Id对于你的媒体对象(你没有准确指定 - 你想要 10个第一个对象 - 但是你没有说出这些将被订购的内容; 前十个 em>总是暗示必须有某些订单 - 根据您的情况需要更改我的CTE查询!)

所以尝试这样的事情:

;WITH PartitionedComponents AS
(
   SELECT 
       CollectionID = c.ID, 
       c.Name, 
       c.Description,
       MediaObjectId = m.ID,
       ROW_NUMBER() OVER(PARTITION BY c.ID ORDER BY m.ID DESC) AS 'RowNum'
   FROM 
       dbo.BB_Collection c
   INNER JOIN
       dbo.BB_MEDIAOBJECT_COLLECTION mc ON mc.CollectionId = c.ID
   INNER JOIN
       dbo.BB_MEDIAOBJECT m ON mc.MediaObjectId = m.Id
   WHERE
       ......
)
SELECT 
   CollectionID, 
   Name, 
   Description,
   MediaObjectId
FROM 
   PartitionedComponents
WHERE
   RowNum <= 10

在这里,我选择了每个&#34;分区的前十个条目&#34; (即每个Id) - 由Id(MediaObjects)以降序排序。

这是否接近你正在寻找的东西?

相关问题