SELECT *
FROM ( SELECT b.* ,
LAG(b.OperatorTime, 1, b.OperatorTime) OVER ( PARTITION BY b.No ORDER BY b.OperatorTime ) AS BeforTime ,
LEAD(b.OperatorTime, 1, b.OperatorTime) OVER ( PARTITION BY b.No ORDER BY b.OperatorTime ) AS NextTime
FROM Test b
) a
WHERE DATEDIFF(HH, a.BeforTime, a.OperatorTime) < 24
AND DATEDIFF(HH, a.OperatorTime, a.NextTime) < 24
AND a.No IN ( SELECT c.No
FROM dbo.Test c
GROUP BY c.No
HAVING COUNT(c.No) > 1 )
LAG函数:
作用:访问相同结果集中先前行的数据,而用不使用 SQL Server 2016 中的自联接。 LAG 以当前行之前的给定物理偏移量来提供对行的访问。 在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。
语法:
LAG (scalar_expression [,offset] [,default]) OVER ( [ partition_by_clause ] order_by_clause )
SELECT SalesOrderID, ProductID, OrderQty ,
SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Total ,
AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Avg" ,
COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Count" ,
MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Min" ,
MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS "Max"
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
SalesOrderID ProductID OrderQty Total
Avg Count Min Max