Row_Number, Rank, Dense_rank все начинается со случайных чисел для групп наборов данных - PullRequest
0 голосов
/ 08 января 2019

У меня есть таблица, которая содержит данные о товаре с информацией о расценках (оценка, данная клиенту, указанная торговым представителем по конкретным продуктам) для конкретных учетных записей. У этого также есть финансовый квартал и финансовая неделя, соответствующая дате, которую это было создано. Может быть несколько цитат для одного и того же продукта и одной и той же учетной записи в зависимости от обратной связи между торговым представителем и клиентом. Я хочу ранжировать эти котировки на основе комбинации аккаунта и продукта и упорядочить их по котировке, которая была создана последней. Вот запрос, который я использую:

Обратите внимание, что я также пытался использовать 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 для некоторых учетных записей, в то время как для других учетных записей он даже начинается с 10000. Поскольку следующий шаг включает рассмотрение номеров строк, которые ранжируются как 1, это создает проблему. Был бы очень признателен, если бы кто-нибудь мог помочь мне понять причину такого поведения кода.

1 Ответ

0 голосов
/ 09 января 2019

Зависит от количества полученных строк, возможно, проблема связана с порядком. Я бы предложил вам переписать его более четко, используя 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;
...