SQL Расчет медианы на продукт в курсоре - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь рассчитать медиа для продукта (SKU) в выбранном списке, но это занимает несколько часов. Я получаю список, состоящий из 4 столбцов (SKU, Branch, PriceList, Campaign), и мне нужно импортировать новую строку данных для SKU с медиа-каталогом SKU в качестве PriceList.

Для этого я импортирую уникальный список артикулов в TEMP TABLE, затем создайте CURSOR для запуска через TEMP TABLE, вычислите медиану в CURSOR.

DECLARE @c BIGINT
DECLARE @SKUVal FLOAT
DECLARE @Total int

SELECT DISTINCT SKU, 
                'DFLT' AS Branch,
                0 AS PriceList,
                NULL AS Campaign
INTO #SKU
FROM eCommerce_Pricing
WHERE PriceList > 0.0

SELECT @Total = COUNT(*) FROM #SKU

DECLARE Cur1 CURSOR LOCAL SCROLL DYNAMIC READ_ONLY
FOR
SELECT  SKU
FROM #SKU

OPEN Cur1
    FETCH NEXT FROM Cur1 INTO
    @SKU

    WHILE @@FETCH_STATUS = 0
    BEGIN

        SET @c = (SELECT COUNT(*) FROM eCommerce_Pricing WHERE SKU = @SKU)

        SELECT @SKUVal =  AVG(1.0 * PriceList)
        FROM (
            SELECT PriceList FROM dbo.eCommerce_Pricing
            WHERE SKU = @SKU
             ORDER BY PriceList
             OFFSET (@c - 1) / 2 ROWS
             FETCH NEXT 1 + (1 - @c % 2) ROWS ONLY
        ) AS x

        UPDATE #SKU
        SET PriceList = @SKUVal
        WHERE SKU = @SKU

        SET @Total = @Total-1
        PRINT CAST(@Total AS VARCHAR(100)) + ' records left'

    FETCH NEXT FROM Cur1 INTO
            @SKU
            END
    DEALLOCATE Cur1

SELECT * FROM #SKU
DROP TABLE #SKU

Любая рекомендация будет принята с благодарностью. Я использую SQL Север 2014.

1 Ответ

1 голос
/ 21 января 2020

Если вы хотите медианы, используйте percentile_cont() или percentile_disc(). Из того, что я могу догадаться из вашего вопроса, вы хотите что-то вроде этого:

select distinct sku,
       percentile_disc(0.5) within group (order by price) over (partition by sku) as median
from dbo.eCommerce_Pricing;

Надеюсь, вы узнали, что курсоры мучительно медленны и не лучший подход почти к любой проблеме в SQL (ну, они действительно используются, но не для какой-либо функциональности, уже имеющейся в базе данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...