使用 OVER 或 LAG 函数来计算 ROLLING 五天内的订单数量?
Use OVER or LAG functions to COUNT the number of orders in a ROLLING five day period?
我想在 Partition BY Customer 和 Orderdate 排序后连续 5 天计算订单数。
我的目标是识别大量 and/or 潜在的欺诈账户。找出所有在 5 天内有 X 个订单的客户。
我在 Win10 中使用 SQL 服务器 (SSMS v17.9.1)。
我尝试将 OVER 与 Range 和 DATEADD 一起使用,但收到错误 "Incorrect syntax near DATEADD. Expected CURRENT, INTEGER or UNBOUNDED"。
我用计算字段减去 5 天 (DateMinus5) 测试了 OrderDate 字段,以确保日期字段正常。
我的代码产生了错误 "Incorrect syntax near DATEADD. Expected CURRENT, INTEGER or UNBOUNDED"。
SELECT [SalesOrderID]
,[OrderDate]
,[CustomerID]
,COUNT(*) OVER (Partition BY [CustomerID] RANGE BETWEEN DATEADD(Day,
-5, [Orderdate]) AND CURRENT ROW)
FROM [AdventureWorks2014].[Sales].[SalesOrderHeader]
╔═══════════════╦═════════════════════════╦═════════════════════════╦════════════╗
║ Sales OrderId ║ OrderDate ║ DateMinus5 ║ CustomerId ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43659 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29825 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43660 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29672 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43661 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29734 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43662 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29994 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43663 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29565 ║
╚═══════════════╩═════════════════════════╩═════════════════════════╩════════════╝
SELECT SalesOrderID, OrderDate, CustomerID
FROM Sales.SalesOrderHeader o CROSS APPLY (
SELECT COUNT(*) cnt FROM Sales.SalesOrderHeader o2
WHERE o2.CustomerID = o.CustomerID
AND o2.OrderDate BETWEEN DATEADD(DAY, -5, o.OrderDate) AND o.OrderDate
) lg
WHERE cnt >= X;
我想在 Partition BY Customer 和 Orderdate 排序后连续 5 天计算订单数。
我的目标是识别大量 and/or 潜在的欺诈账户。找出所有在 5 天内有 X 个订单的客户。
我在 Win10 中使用 SQL 服务器 (SSMS v17.9.1)。
我尝试将 OVER 与 Range 和 DATEADD 一起使用,但收到错误 "Incorrect syntax near DATEADD. Expected CURRENT, INTEGER or UNBOUNDED"。
我用计算字段减去 5 天 (DateMinus5) 测试了 OrderDate 字段,以确保日期字段正常。
我的代码产生了错误 "Incorrect syntax near DATEADD. Expected CURRENT, INTEGER or UNBOUNDED"。
SELECT [SalesOrderID]
,[OrderDate]
,[CustomerID]
,COUNT(*) OVER (Partition BY [CustomerID] RANGE BETWEEN DATEADD(Day,
-5, [Orderdate]) AND CURRENT ROW)
FROM [AdventureWorks2014].[Sales].[SalesOrderHeader]
╔═══════════════╦═════════════════════════╦═════════════════════════╦════════════╗
║ Sales OrderId ║ OrderDate ║ DateMinus5 ║ CustomerId ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43659 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29825 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43660 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29672 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43661 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29734 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43662 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29994 ║
╠═══════════════╬═════════════════════════╬═════════════════════════╬════════════╣
║ 43663 ║ 2005-07-01 00:00:00.000 ║ 2005-06-26 00:00:00.000 ║ 29565 ║
╚═══════════════╩═════════════════════════╩═════════════════════════╩════════════╝
SELECT SalesOrderID, OrderDate, CustomerID
FROM Sales.SalesOrderHeader o CROSS APPLY (
SELECT COUNT(*) cnt FROM Sales.SalesOrderHeader o2
WHERE o2.CustomerID = o.CustomerID
AND o2.OrderDate BETWEEN DATEADD(DAY, -5, o.OrderDate) AND o.OrderDate
) lg
WHERE cnt >= X;