Расчет столбца категории с помощью функции Window в T-SQL - PullRequest
1 голос
/ 10 июня 2019

Мой вопрос прост, но я не могу найти решение этой проблемы - возможно, с помощью оконных функций у меня есть следующие примеры данных:

ID  OrderDate   TotalOrder
--------------------------
1   2019-01-01   5
2   2019-01-02   3
3   2019-01-03   1
4   2019-01-04  15
5   2019-01-05  20
6   2019-01-06  18
7   2019-01-07   2
8   2019-01-08   4
9   2019-01-09   9

И требуемый результат:

ID  OrderDate   TotalOrder  Category
-------------------------------------
1   2019-01-01   5          1
2   2019-01-02   3          1
3   2019-01-03   1          1
4   2019-01-04  15          2
5   2019-01-05  20          2
6   2019-01-06  18          2
7   2019-01-07   2          3
8   2019-01-08   4          3
9   2019-01-09   9          3

Столбец Category рассчитывается на основе диапазона значений TotalOrder.

И если значение TotalOrder меньше 10, значение Category увеличивается.

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

Вы можете использовать LAG и SUM OVER():

-- Create sample data
CREATE TABLE #Tbl(
    ID          INT,
    OrderDate   DATE,
    TotalOrder  INT
);
INSERT INTO #Tbl VALUES
(1, '2019-01-01', 5),   (2, '2019-01-02', 3),   (3, '2019-01-03', 1),
(4, '2019-01-04', 15),  (5, '2019-01-05', 20),  (6, '2019-01-06', 18),
(7, '2019-01-07', 2),   (8, '2019-01-08', 4),   (9, '2019-01-09', 9);

-- Query
WITH Cte AS(
    SELECT *,
        LessThanTen = CASE WHEN TotalOrder < 10 THEN 1 ELSE 0 END
    FROM #Tbl
),
CteLag AS (
    SELECT *,
        Prev = LAG(LessThanTen, 1, NULL) OVER(ORDER BY OrderDate, ID)
    FROM Cte
)
SELECT
    ID,
    OrderDate,
    TotalOrder,
    Category = SUM(CASE WHEN Prev = LessThanTen THEN 0 ELSE 1 END) OVER(ORDER BY OrderDate, ID)
FROM CteLag
ORDER BY OrderDate, ID;

-- Cleanup
DROP TABLE #Tbl;

ONLINE DEMO

1 голос
/ 10 июня 2019

На основании данных выборки и ожидаемых результатов,
Я думаю, вы имеете в виду, что вы хотите добавить один в столбец category каждый раз, когда разница между столбцом TotalOrder текущей строки и столбцом TotalOrder предыдущей строки составляет 10 или выше, когда порядок строк определяется OrderDate столбец.

Итак, с помощью примера данных из ответа Феликса, я думаю, вы ищете что-то вроде этого:

WITH CTE AS
(
SELECT  Id, 
        OrderDate, 
        TotalOrder,
        -- IIF is shorthand for case then else
        IIF(
            -- if the difference in TotalOrder between current row and previous row is more than 10.
            ABS(TotalOrder - ISNULL(LAG(TotalOrder) OVER(ORDER BY OrderDate), TotalOrder - 11)) > 10
            , 1
            , 0
        ) As IsDiffMoreThanTen

FROM #Tbl
)

SELECT  Id, 
        OrderDate, 
        TotalOrder,
        -- sum the IsDiffMoreThanTen column over order by OrderDate.
        SUM(IsDiffMoreThanTen) OVER(ORDER BY OrderDate) AS Category
FROM CTE

Результаты:

Id  OrderDate   TotalOrder  Category
1   01.01.2019  5           1
2   02.01.2019  3           1
3   03.01.2019  1           1
4   04.01.2019  15          2
5   05.01.2019  20          2
6   06.01.2019  18          2
7   07.01.2019  2           3
8   08.01.2019  4           3
9   09.01.2019  9           3
...