sql - 在 T-SQL 中使用 Window 函数计算类别列
问题描述
我的问题很简单,但我找不到解决方案 - 可能使用窗口函数,我有以下示例数据:
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
则增加 的值。
解决方案
你可以使用LAG
and 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;
推荐阅读
- javascript - 如何在 Javascript 中创建准确的 setTimeout(不是间隔)?
- c# - Odata 不支持“GroupBy”方法
- c++ - 无效函数使用相同的变量打印两个不同的答案
- swift - 带有持续时间的循环动画,Swift 4
- javascript - 如何关闭手风琴菜单的打开部分?
- python - Scrapy/Python 请求优先级和 CONCURRENT_REQUESTS
- c# - 谷歌浏览器向每个控制器/剃须刀页面发送 2 个请求
- r - 如何使用 Nix 包管理器添加本地 R 包
- java - Spring MVC 表单 - 支持对象有 150 多个字段,可以自动生成 HTML 表单吗?
- google-calendar-api - Google 日历 API 返回未经授权