前N个结果分组Oracle SQL

时间:2013-07-29 17:20:40

标签: sql oracle

我想写一个查询,只允许我获取我想要的特定数据,仅此而已。

我们将以电视为例。我有三个品牌的电视,我希望看到每个品牌的十大畅销机型。我只想要返回30行。一个解决方案是工会,但这可能会很快变得混乱。理想情况下,会根据情况进行WHERE ROWNUM分组。

SELECT 
    A.Brand
,   A.Model
,   A.Sales
FROM 
(   SELECT
        TV.Brand
    ,   TV.Model 
    ,   SUM(TV.SALES) AS SALES
    FROM TV_TABLE as TV
    ORDER BY 
        TV.Brand
    ,   SALES DESC
)   A
WHERE ROWNUM <10 

在上面的代码中,我将从内部查询中获得前10个总结果,但不会从每个分组获得10个结果。

我想看到的是这样的:

  

品牌:型号:销售
  索尼:x10:20
  索尼:X20:18
  索尼:X30:10
  VISIO:A40:40
  VISIO:A20:10

这是一个过于简单的例子,在实践中我需要有20-50个gropings,并且希望避免下载所有数据并使用Pivot功能。

2 个答案:

答案 0 :(得分:5)

 select Brand, Model, SALES
 from(
    select Brand, Model, SALES,row_number()over(partition by Brand order by SALES desc) rn
    from (
        SELECT TV.Brand, TV.Model,SUM(TV.SALES) AS SALES,
        FROM TV_TABLE as TV
        group BY TV.Brand,TV.Model
    )a
)b
where rn <= 10

答案 1 :(得分:0)

SELECT TV.Brand, TV.Model, SUM(TV.SALES) AS SALES
FROM TV_TABLE TV
group by TV.Brand, TV.Model
order by SUM(TV.SALES) desc, TV.Brand
limit 30