2011-11-23 42 views
4

我拥有一些数据 - 针对不同公司的不同年份的销售数据。 因此,我有该公司(当年)的公司ID,YearSales用于查找特定类型数据集的列的前n个值的SQL查询

我想要的是获得销售额的TOP n价值和相应的公司IDYear,为每个有数据的公司。

在SO中还有其他疑问,但它们是用于单个列的直接前向TOP n值(没有像这里所要求的条件)。

任何帮助,将不胜感激......

+0

什么版本的sql server? –

回答

5

你可能需要的东西是这样的:

select 
    CompanyName, 
    Year, 
    Sales 

from (
    select *, 
    row_number() over (partition by CompanyName order by Sales desc) as RowNbr 

    from data) src 

where RowNbr <= 5 

order by CompanyName, Sales desc 

只需用任何你喜欢的号码更换5。

3

如果你是SQL 2005+,该CTE方法将工作:

WITH salesWithRank AS 
(
    SELECT CompanyID, Year, Sales 
     , RANK() OVER (PARTITION BY CompanyId ORDER BY Sales DESC) AS RowNumber 
    FROM SalesData 
) 
SELECT CompanyID, Year, Sales 
FROM salesWithRank AS s 
WHERE RowNumber <= 10 -- Top 10 sales for each CompanyId, any year 
ORDER BY CompanyId ASC, Sales DESC 

请注意,如果您在表中有公司名称,你可以使用,也在订购。

0

只是要直截了当:

SELECT TOP 3 CompanyID, Year, Sales 
FROM (SELECT CompanyID, Year, Sales, 
      ROW_NUMBER() OVER(ORDER BY CompanyID ASC,Sales DESC) AS RowNumber 
     FROM TargetTbl) AS TempTable 
ORDER BY RowNumber ASC 

编辑:有n的所需值(行上面的数字)代替3。

+0

-1。这将不会检索所有公司的最后X年,它将检索所有公司中最高的X销售年度。一些公司可能被复制,有些可能被排除在外。 –

+0

你好@AdamRobinson,如何“SELECT CompanyID,Year,Sales,ROW_NUMBER()OVER(ORDER BY CompanyID ASC,Sales DESC)AS RowNumber FROM TargetTbl”排除了一些行,尽管这可能包含一些重复的数据,但它不是题。 提问者询问前N个数据无条件,“销售额的前n个值”是问题的一部分,这意味着他希望销售DESC的订单。请您再次审查,感谢您的时间。 –

+0

OP希望每个公司的N个销售年份*。无论公司(即公司A可能拥有全部5个插槽),您的SQL将获得前N个销售年限。您的查询在功能上等同于'选择前N个CompanyID,年,来自TargetID的销售,通过CompanyID销售,销售desc'。 –

相关问题