|
我试图计算开始日期和结束日期结束日期的最大数量。日期范围不需要完全连续,只需要月份连续。例如,如果客户的日期范围为01/01/2012-06/01/2012和07/01/2012-08/31/2012,我们连续8个月计算6月和7月。
9 Y' k( v4 H) u, `示例数据如下。5 E6 T u$ C k6 ]
基本表 CustomerID StartDate EndDate ---------- ---------- ---------- 100101/01/201201201/01/201201201/01/201201/201201201/01/201/201201201/201201/201201201/201201201/201201201201201201201201201/01/201201201/201201201/201201201201/201201201/201201201201/01/201201201201201/01/201201201/201201201201201201201201201201201201201200120120120120012012012012001200120012012001/01/201201/201201201201/01201201201201201201/201201201201201/201201/201201/201201201201/01201201201201201201/201201201/01201201201201201201201201201201201/01/01/201/01201/01/01/01/01/01201/201201201201/201/201/201/201201/201201/201201/201201/201/201/201201201201201201/201201201201201201201201201201
4 r" T: p) }! c. q) @结果 CustomerID MaxContinuous ---------- -------------1001 8 1002 8 10035 1004
4 {+ t5 ~# p! c( I+ ]你应该能够创建一个子表,每个月都有一个循环,然后在表中找到一个连续的月,但这涉及两个循环,我希望避免。5 }/ I8 s, e8 d
- P0 F! p( p3 x' Q9 t1 t# w
解决方案:
; V2 B @ ~9 H+ i' d 如果一个习俗不能有重叠的日期,那么这个问题就很容易了。首先,根据每个记录查看我们有多少个月:) Q, O- @8 g8 |9 ~9 B7 v
SELECT CustomerID,ABS(DATEDIFF('MONTH',StartDate,EndDate)) as Months FROM BaseData然后得到最大
0 S' o: w* e" w: p \/ Q# r SELECT CustomeID,MAX(Months) AS MaxContig FROM ( SELECT CustomerID,ABS(DATEDIFF('MONTH',StartDate,EndDate)) as Months FROM BaseData ) sub由于流行的需求,如何使用递归?CTE的方法-请注意,此代码是基于上述代码的,所以请在您深入之前了解它。您还必须了解递归CTE工作方法。 n. p Q& I; ~ _: h4 t+ t3 G9 F9 j
WITH rangeList AS ( SELECT CustomerID, StartDate, EndDate, DATEDIFF(month,StartDate,EndDate) 1 as Months FROM Customers UNION ALL SELECT R.CustomerID, R.StartDate, BD.EndDate, DATEDIFF(month,R.StartDate,BD.EndDate) 1 as Months FROM rangeList R JOIN Customers BD ON R.CustomerID = BD.CustomerID AND Month(DATEADD(month,1,R.EndDate)) = Month(BD.StartDate) AND Year(DATEADD(month,1,R.EndDate)) = Year(BD.StartDate) ) SELECT CustomerID,Max(Months) as MaxContig FROM rangeList GROUP BY CustomerID小提琴:http
- Q* L1 ~% g9 c" U5 C9 \( q://sqlfiddle.com/#!6/eee59/14
; F) o1 {- I; y0 q9 F$ k( e本解决方案的一些注意事项) B3 y2 x: n' o4 X8 {& y
开始日期必须早于结束日期(这个问题可以更改)# v) U- i* d6 Z4 K' O8 G
日期不能重叠(可以更改以解决此问题)/ W# e+ G9 y( A& z2 ]
您可能需要使用连接,因为这取决于您的规格…如前所述,如果开始日期和结束日期在同一个月内,则该方法将无效-但也许应该吗?但请记住要小心,有无限递归很容易。 |
|