我擁有一些數據 - 針對不同公司的不同年份的銷售數據。 因此,我有該公司(當年)的公司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? –