1
A
回答
1
這將產生所需的結果。不像戈登那麼優雅,但它確實可以彌補日期和重複日期。
如果您有日曆/提示表,則可以刪除cte邏輯。
例
Declare @YourTable Table ([AsOfDate] Date,[SecurityID] varchar(50),[IsHeld] bit)
Insert Into @YourTable Values
('2017-05-19','S1',1)
,('2017-05-20','S1',1)
,('2017-05-21','S1',1)
,('2017-05-22','S1',1)
,('2017-05-23','S1',0)
,('2017-05-24','S1',0)
,('2017-05-25','S1',0)
,('2017-05-26','S1',1)
,('2017-05-27','S1',1)
,('2017-05-28','S1',1)
,('2017-05-29','S1',0)
,('2017-05-30','S1',0)
,('2017-05-31','S1',1)
;with cte1 as (Select D1=min(AsOfDate),D2=max(AsOfDate) From @YourTable)
,cte2 as (
Select Top (DateDiff(DAY,(Select D1 from cte1),(Select D2 from cte1))+1)
D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),(Select D1 from cte1))
,R=Row_Number() over (Order By (Select Null))
From master..spt_values n1,master..spt_values n2
)
Select [SecurityID]
,[StartDate] = min(D)
,[EndDate] = max(D)
From (
Select *,Grp = dense_rank() over (partition by securityId order by asofdate)-R
From @YourTable A
Join cte2 B on AsOfDate=B.D
Where IsHeld=1
) A
Group By [SecurityID],Grp
Order By min(D)
返回
SecurityID StartDate EndDate
S1 2017-05-19 2017-05-22
S1 2017-05-26 2017-05-28
S1 2017-05-31 2017-05-31
+0
謝謝John的幫助。 – Ram
+1
@Ram高興地幫助。 –
1
這是間隙和孤島問題的變體。在這種情況下,你可以使用日期計算與鄰近的日期來計算行:
select securityId, isheld, min(asofdate), max(asofdate)
from (select t.*,
datediff(day,
- row_number() over (partition by securityId, isheld
order by asofdate
),
asofdate) as grp
from t
) t
group by grp, securityId, isheld;
注:這是假定的日期是連續的,沒有重複。該查詢可以修改以考慮這些因素。
基本思想是,如果你有一個一天增加一個日的序列,那麼你可以減去一系列值並得到一個常數。這就是grp
是。剩下的只是聚合。
相關問題
- 1. 如何獲得辭典Python列表匹配給定的標準
- 2. 如何獲得Django .filter(something__in = some_set)查詢的* UN *匹配標準?
- 3. 如何獲得最後一個Git標籤匹配正則表達式標準
- 4. 如何獲得標準差
- 5. 如何獲得wifi標準
- 6. SQL匹配標準
- 7. SQL獲得匹配的第一次約會的標準
- 8. 獲取與客戶不匹配標準
- 9. scala specs2 - 如何匹配匹配器或標準列表?
- 10. 如何獲得其他數組值如果匹配?
- 11. MySQL獲得與其他表匹配的前10項匹配
- 12. 替換匹配的標準
- 13. 如何獲得與其他nsstring對象的nsstring匹配計數?
- 14. Rails - 如何獲得匹配其他條件的記錄的ID
- 15. LWJGL無法獲得匹配的座標
- 16. Yii中的標準如何獲得COUNT(*)
- 17. 如何獲得Verilog語言標準?
- 18. 如何獲得匹配jQuery選擇
- 19. - [NSURLCache cachedResponseForRequest:]如何獲得匹配緩存?
- 20. 如何使用grep獲得匹配[1]?
- 21. 如何獲得最低匹配的captureno?
- 22. 如何獲得匹配顏色#f20044
- 23. 如何在Regex.Replace()中獲得匹配?
- 24. 如何獲得匹配的db記錄
- 25. 如何使用MODE獲得最匹配的匹配號碼
- 26. 貓鼬聚合得到所有匹配的一組匹配的另一標準
- 27. 如何獲得座標的路徑匹配位置?
- 28. solr如何獲得最接近的標題匹配
- 29. 無論如何索引/匹配兩個標準來獲得使用唯一標識符的第二組數據?
- 30. 索引匹配,其中匹配號碼不準確
的SQL Server的哪個版本? – Shawn
@Shawn其Microsoft SQL Server 2008(SP4) – Ram