我拥有一些数据 - 针对不同公司的不同年份的销售数据。 因此,我有该公司(当年)的公司ID
,Year
和Sales
。用于查找特定类型数据集的列的前n个值的SQL查询
我想要的是获得销售额的TOP n
价值和相应的公司ID
和Year
,为每个有数据的公司。
在SO中还有其他疑问,但它们是用于单个列的直接前向TOP n
值(没有像这里所要求的条件)。
任何帮助,将不胜感激......
我拥有一些数据 - 针对不同公司的不同年份的销售数据。 因此,我有该公司(当年)的公司ID
,Year
和Sales
。用于查找特定类型数据集的列的前n个值的SQL查询
我想要的是获得销售额的TOP n
价值和相应的公司ID
和Year
,为每个有数据的公司。
在SO中还有其他疑问,但它们是用于单个列的直接前向TOP n
值(没有像这里所要求的条件)。
任何帮助,将不胜感激......
你可能需要的东西是这样的:
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。
如果你是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
请注意,如果您在表中有公司名称,你可以使用,也在订购。
只是要直截了当:
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。
-1。这将不会检索所有公司的最后X年,它将检索所有公司中最高的X销售年度。一些公司可能被复制,有些可能被排除在外。 –
你好@AdamRobinson,如何“SELECT CompanyID,Year,Sales,ROW_NUMBER()OVER(ORDER BY CompanyID ASC,Sales DESC)AS RowNumber FROM TargetTbl”排除了一些行,尽管这可能包含一些重复的数据,但它不是题。 提问者询问前N个数据无条件,“销售额的前n个值”是问题的一部分,这意味着他希望销售DESC的订单。请您再次审查,感谢您的时间。 –
OP希望每个公司的N个销售年份*。无论公司(即公司A可能拥有全部5个插槽),您的SQL将获得前N个销售年限。您的查询在功能上等同于'选择前N个CompanyID,年,来自TargetID的销售,通过CompanyID销售,销售desc'。 –
什么版本的sql server? –