Есть ли способ определить диапазон NTILE в SQL Server? - PullRequest
0 голосов
/ 01 марта 2020

В следующем запросе я использую функцию NTILE, чтобы сгруппировать результат по разнице в процентах. Я никогда не использовал эту функцию раньше, но мне было интересно, есть ли способ «определить», какой диапазон процентов go в каких процентилях - то есть я бы определил квартиль '4', например, как 10 - 90 процентов. Может быть, это неправильная функция для использования здесь? Любая помощь будет отличной. Обратите внимание, что на самом деле в предложении WHERE содержится на TON больше материалов, чем указано здесь - это только для примера.

Спасибо.

Запрос:

WITH NonExcessCTE (MATERIAL, SIZE_LITERAL, TOTAL_SIZE, TOTAL_MATERIAL, SIZE_PERCENT)

AS (

SELECT DISTINCT MATERIAL, SIZE_LITERAL,
       SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) AS TOTAL_SIZE,
       SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS TOTAL_MATERIAL,
       100.0 * SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) /
       SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS SIZE_PERCENT
FROM VW_MRP_ALLOCATION_COMBINED
WHERE REQUIREMENT_TYPE <> '' 
AND STOCK_CATEGORY <> 'A60386045'
), 

     ExcessCTE (MATERIAL, SIZE_LITERAL, TOTAL_SIZE, TOTAL_MATERIAL, SIZE_PERCENT)

AS (

SELECT DISTINCT MATERIAL, SIZE_LITERAL,
       SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) AS TOTAL_SIZE,
       SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS TOTAL_MATERIAL,
       100.0 * SUM(QUANTITY) OVER (PARTITION BY MATERIAL, SIZE_LITERAL) /
       SUM(QUANTITY) OVER (PARTITION BY MATERIAL) AS SIZE_PERCENT
FROM VW_MRP_ALLOCATION_COMBINED
WHERE REQUIREMENT_TYPE = ''
AND STOCK_CATEGORY <> 'A60386045'
)

SELECT E.MATERIAL, 
       E.SIZE_LITERAL,
       E.TOTAL_SIZE,
       ROUND(E.SIZE_PERCENT,0) AS 'EXCESS_SIZE_PERCENT',
       ROUND(N.SIZE_PERCENT,0) AS 'NON_EXCESS_SIZE_PERCENT', 
       ROUND(ABS(E.SIZE_PERCENT - N.SIZE_PERCENT),0) AS 'DIFFERENCE',
       NTILE(4) OVER(ORDER BY ROUND(ABS(E.SIZE_PERCENT - N.SIZE_PERCENT),0)) AS 'QUARTILE'


FROM NonExcessCTE N JOIN ExcessCTE E ON N.MATERIAL = E.MATERIAL AND N.SIZE_LITERAL = E.SIZE_LITERAL 

WHERE N.MATERIAL IN ('EE4726',
'EE4726',
'EE4727')

ORDER BY ROUND(ABS(E.SIZE_PERCENT - N.SIZE_PERCENT),0) DESC
...