SELECT
top 10
ProductNumberId,
MIN(OrderOn) OVER (PARTITION BY ProductNumberId) AS MinOrderOn,OrderOn,ProductQuantity, --每个产品的最小时间
RANK() OVER(ORDER BY ProductQuantity DESC) AS ProductQuantity_rank, -- ProductQuantity全局排名
SUM(ProductQuantity) OVER(PARTITION BY ProductNumberId
--时间排序
ORDER BY OrderOn
--游标累加
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS lifetime_value,
SUM(ProductQuantity) OVER(
PARTITION BY ProductNumberId
) AS counts,
-- 过滤统计
OrderStage,
SUM(CASE WHEN OrderStage=50 THEN ProductQuantity ELSE 0 END) OVER(PARTITION BY ProductNumberId) as selectCount,
--统计产品订单数量
COUNT(*) OVER (PARTITION BY ProductNumberId) AS ProductNumberId_total,
-- 统计所有订单数量
COUNT(*) OVER () AS total_count,
--计算各产品的平均值
AVG(ProductQuantity) OVER(PARTITION BY ProductNumberId) AS ProductQuantity_avg,
--计算最近相连3个的平均值
AVG(ProductQuantity) OVER(
ORDER BY ProductQuantity desc
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS ProductQuantity_3avg
--INTO #ProductOrderTimes
FROM SL_mk_Schema.SalesOrder where ProductNumberId='000095ae4bbf482c8468fc473d58c2b7' ORDER BY ProductQuantity desc ;
使用窗口函数在保留每条数据的同时,可以计算各个维度的数据进行行数据对比,但是也要注意一下几点
- 性能优化:大数据量时,避免对全表使用无分区的窗口函数(如
COUNT(*) OVER()
),优先考虑分区或过滤条件。 - 空值处理:
COUNT(*)
统计所有行(包括空值),若需排除空值可用COUNT(column_name)
。 - 框架控制:通过
ROWS/RANGE
定义窗口范围(如ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING
)可实现滑动窗口统计。