請嘗試這是一個觀點:
ALTER VIEW [dbo].[vw_Test2] AS
WITH PreResult AS (
SELECT p.Id,p.EmpID,p.[DateTime],CASE WHEN LEAD(p.diff)OVER(ORDER BY p.Id) > 1 OR LEAD(p.EmpID)OVER(ORDER BY p.Id)<>p.EmpID THEN 1 ELSE 0 END StartNewGroup
FROM (
SELECT t.Id,t.EmpID,t.[DateTime], COALESCE(DATEDIFF(day,LAG(t.[DateTime])OVER(PARTITION BY t.EmpID ORDER BY t.Id),t.[DateTime]),1) [diff]
FROM [dbo].[vw_Test] t
) p
)
SELECT r.Id,r.EmpID,r.[DateTime]
,CASE WHEN COUNT(*)OVER(PARTITION BY r.NewGroup ORDER BY r.NewGroup) >= 6 THEN 250 ELSE 125 END [Rate]
FROM (
SELECT b.Id,b.EmpID,b.[DateTime],1+COALESCE((SELECT SUM(a.StartNewGroup) FROM PreResult a WHERE a.Id<b.Id),0) NewGroup
FROM PreResult b
) r
GO
另外也查詢一起玩:
CREATE TABLE #Test (Id BIGINT IDENTITY(1,1),EmpID BIGINT, [DateTime] DATETIME)
INSERT INTO #Test (EmpID,[DateTime]) VALUES (5,'20150106'),(5,'20150107'),(5,'20150109'),
(5,'20150110'),(5,'20150126'),(5,'20150127'),
(5,'20150128'),(5,'20150129'),(5,'20150130'),
(5,'20150131'),(10,'20121203'),(10,'20121204'),
(10,'20121205'),(10,'20121206'),
(10,'20121207'),(10,'20121208'),(10,'20121209')
;WITH PreResult AS (
SELECT p.Id,p.EmpID,p.[DateTime],CASE WHEN LEAD(p.diff)OVER(ORDER BY p.Id) > 1 OR LEAD(p.EmpID)OVER(ORDER BY p.Id)<>p.EmpID THEN 1 ELSE 0 END StartNewGroup
FROM (
SELECT t.Id,t.EmpID,t.[DateTime], COALESCE(DATEDIFF(day,LAG(t.[DateTime])OVER(PARTITION BY t.EmpID ORDER BY t.Id),t.[DateTime]),1) [diff]
FROM #Test t
) p
)
SELECT r.Id,r.EmpID,r.[DateTime]
,CASE WHEN COUNT(*)OVER(PARTITION BY r.NewGroup ORDER BY r.NewGroup) >= 6 THEN 250 ELSE 125 END [Rate]
FROM (
SELECT b.Id,b.EmpID,b.[DateTime],1+COALESCE((SELECT SUM(a.StartNewGroup) FROM PreResult a WHERE a.Id<b.Id),0) NewGroup
FROM PreResult b
) r
DROP TABLE #Test
如果您有任何問題,請讓我知道。
請給一些更多的信息,例如想要的結果,如輸入所示! – jarlh 2015-02-10 08:20:24
我正在使用MSSQL – CodeMind 2015-02-10 08:33:58
請參閱此鏈接http://stackoverflow.com/questions/20402089/detect-consecutive-dates-ranges-using-sql – DevelopmentIsMyPassion 2015-02-10 08:38:31