Row_Number,Rank,Dense_rank均从数据集组的随机数开始

时间:2019-01-08 17:57:56

标签: sql sql-server tsql sql-server-2008 sql-server-2012

我有一个表,其中包含产品数据,其中包含特定帐户的报价信息(由特定产品的销售代表提供给客户的估算值)。它还具有与创建日期相对应的财务季度和财务周。根据销售代表和客户之间的来回沟通,同一产品和同一帐户可以有多个报价。我想根据帐户和产品组合对这些报价进行排名,并按最后创建的报价进行排序。以下是我正在使用的查询:

请注意,我也尝试使用Rank和Dense_Rank代替row_number

SELECT * FROM 
(SELECT 
     Account_ID
    ,Quote_Number
    ,Product
    ,Fiscal_Quarter
    ,Fiscal_Week
    ,ROW_NUMBER () OVER (PARTITION BY Account_ID, Product ORDER BY 
QUOTE_CREATE_DATE DESC, QTE_NUM_VAL DESC) AS ROWNUM
FROM 
tbl_Quotes_Data 
WHERE 
Fiscal_Quarter IN ('2018-Q4')
) X

但是,当我运行此查询时,它对于某些帐户运行良好,而对于大多数帐户,行号被错误地捕获,因此我无法弄清原因。我看到某些帐户的行号仅从600开始,而其他帐户的行号甚至从10,000开始。下一步涉及考虑排名为1的行号,因此会产生问题。如果有人可以帮助我理解此代码行为的原因,将非常感谢。

1 个答案:

答案 0 :(得分:1)

取决于获得的行数,排序可能是导致问题的原因。 我建议您使用CTE并在内部查询中进行过滤,以更清晰的方式重写它:

WITH CTE AS (
SELECT 
    Account_ID,
    Quote_Number,
    Product,
    Fiscal_Quarter,
    Fiscal_Week,
    ROW_NUMBER () OVER (PARTITION BY Account_ID, Product 
                  ORDER BY QUOTE_CREATE_DATE DESC, QTE_NUM_VAL DESC) AS ROWNUM
FROM tbl_Quotes_Data 
WHERE Fiscal_Quarter IN ('2018-Q4')
) 
SELECT *
FROM CTE
ORDER BY Account_ID, Product, ROWNUM;