Amo*_*aik 2 sql-server t-sql sql-server-2012 gaps-and-islands
我想以这样的方式返回数据,即如果代码具有连续的活动日期和结束日期,则数据应给出最小活动日期和最大结束日期,但如果代码已停止,则应显示两个日期
例如桌子
+----+------+---------------+------------+
|Code| Decri| Active Date |End Date |
+----+------+---------------+------------+
|1000| ABC | 1/1/2011 | 30/6/2011 |
|1000| ABC | 1/7/2011 | 30/6/2012 |
|1000| ABC | 1/7/2012 | 30/6/2013 |
|1001| ABC | 1/7/2013 | 30/6/2014 |
|1001| ABC |12/20/2015 |12/20/2017 |
|1003| ABC | 1/1/2011 |30/6/2011 |
|1003| ABC | 1/7/2012 |30/6/2013 |
|1003| ABC | 1/7/2014 |30/6/2015 |
|1003| ABC | 1/7/2015 |12/20/2017 |
+----+------+---------------+------------+
Run Code Online (Sandbox Code Playgroud)
欲望输出
+----+------+---------------+------------+
|Code| Decri| Active Date |End Date |
+----+------+---------------+------------+
|1000| ABC | 1/1/2011 | 30/6/2013 |
|1001| ABC | 1/7/2013 | 30/6/2014 |
|1001| ABC |12/20/2015 |12/20/2017 |
|1003| ABC | 1/1/2011 |30/6/2013 |
|1003| ABC | 1/7/2014 |12/20/2017 |
+----+------+---------------+------------+
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 2012 上,您可以使用LAG
andSUM
与ORDER BY
子句来获取所需内容,而无需任何自联接。LAG
用于确定分区的前一行的值是否与当前行的值[End Date]
正好相差一天。[Start Date]
运行总计用于将各组联系在一起,最后通过简单的聚合即可获得所需的结果。
SELECT\n Code\n, Decri\n, MIN([Active Date]) [Active Date]\n, MAX([End Date]) [End Date]\nFROM\n(\n SELECT\n Code\n , Decri\n , [Active Date]\n , [End Date]\n , SUM(start_new_group) OVER (PARTITION BY Code, Decri ORDER BY [Active Date], [End Date]) group_id\n FROM\n (\n SELECT \n Code\n , Decri\n , [Active Date]\n , [End Date]\n , CASE WHEN DATEADD(DAY, -1, [Active Date]) = LAG([End Date]) OVER (PARTITION BY Code, Decri ORDER BY [Active Date], [End Date]) THEN 0 ELSE 1 END start_new_group\n FROM #x\n ) t\n) t2\nGROUP BY Code, Decri, group_id;\n
Run Code Online (Sandbox Code Playgroud)\n\n结果:
\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 Code \xe2\x95\x91 Decri \xe2\x95\x91 Active Date \xe2\x95\x91 End Date \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1000 \xe2\x95\x91 ABC \xe2\x95\x91 2011-01-01 \xe2\x95\x91 2013-06-30 \xe2\x95\x91\n\xe2\x95\x91 1001 \xe2\x95\x91 ABC \xe2\x95\x91 2013-07-01 \xe2\x95\x91 2014-06-30 \xe2\x95\x91\n\xe2\x95\x91 1001 \xe2\x95\x91 ABC \xe2\x95\x91 2015-12-20 \xe2\x95\x91 2017-12-20 \xe2\x95\x91\n\xe2\x95\x91 1003 \xe2\x95\x91 ABC \xe2\x95\x91 2011-01-01 \xe2\x95\x91 2013-06-30 \xe2\x95\x91\n\xe2\x95\x91 1003 \xe2\x95\x91 ABC \xe2\x95\x91 2014-07-01 \xe2\x95\x91 2017-12-20 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
2995 次 |
最近记录: |