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. 如何获得最后一个Git标签匹配正则表达式标准
- 2. 如何获得wifi标准
- 3. SQL匹配标准
- 4. 如何获得其他数组值如果匹配?
- 5. 替换匹配的标准
- 6. LWJGL无法获得匹配的坐标
- 7. 如何获得Verilog语言标准?
- 8. 如何获得匹配颜色#f20044
- 9. 如何在Regex.Replace()中获得匹配?
- 10. 如何使用grep获得匹配[1]?
- 11. 如何获得匹配jQuery选择
- 12. 如何使用MODE获得最匹配的匹配号码
- 13. 猫鼬聚合得到所有匹配的一组匹配的另一标准
- 14. 如何获得坐标的路径匹配位置?
- 15. solr如何获得最接近的标题匹配
- 16. 索引匹配,其中匹配号码不准确
- 17. 解析errror:Agda和其标准库之间的版本不匹配
- 18. 根据匹配标准搜索
- 19. 匹配标准numpy的删除多行
- 20. 根据一组标准匹配人
- 21. Excel的多个匹配标准
- 22. 匹配适用性标准的算法
- 23. PostgreSQL的查询无匹配标准
- 24. 指数匹配多个标准
- 25. vba excel匹配多个标准
- 26. 如何配置Solr搜索以获得最佳匹配?
- 27. 使用标准分析器在Lucene中获取精确匹配?
- 28. 如何获取多行匹配并将其分配给散列?
- 29. 如何匹配从标准输入读取的字符串?
- 30. 如何指定匹配标准的前N行?
的SQL Server的哪个版本? – Shawn
@Shawn其Microsoft SQL Server 2008(SP4) – Ram