|
我试图写一个函数来识别日期组,并测量组的大小。
6 t; ^' y0 }8 U: j到目前为止,我一直在使用Python进行此过程,但我想将其移入SQL。3 m( ~! j+ R t
例如清单
, q( P+ `7 w! r& K+ ]$ o z$ ?+ pBill 01/01/2011 : x! r' k; _8 y: a# G
Bill 02/01/2011
. k4 J; e- W6 r4 k [Bill 03/01/2011 : t$ P, n/ R( a* n3 S! d: k
Bill 05/01/2011
% A6 x% E' j# g" [/ o) J: VBill 07/01/2011, Y. k$ X# Q3 ^4 l
应该输出到新表中,如下所示: Z' @/ t% `- ~7 M/ p! b
Bill 01/01/2011 3
: e: c; R. I# e/ j# g JBill 02/01/2011 3
6 y1 c$ G+ H* P4 iBill 03/01/2011 3 & V7 q% z: q7 y0 B! I
Bill 05/01/2011 1 : |% f0 A' W$ o3 V- ?- k/ W
Bill 07/01/2011 1: l) I1 k% i6 _* K1 W8 ^; T
理想情况下,这还应该能够解决周末和公共假日的问题-# O$ j8 a$ Y# y) D; S
我表中的日期应该是周一至周五(我想我可以通过制作一个新的工作日表并按顺序编号来解决此问题)。有人建议我尝试CTE。我对此很陌生,因此,我感谢任何人都可以提供的任何指导!谢谢。' B4 Z+ I {, \* z1 u
" _, ]) }: \4 n, y. N% l( _. e/ G3 `解决方案:4 F6 \. Y9 B& _
; J) E& \1 g. O9 ~+ U! B
0 M5 [' u/ n9 X' i+ J, n- I% D4 ^. e
您可以通过巧妙地使用窗口功能来做到这一点。考虑以下:
- k- L* ~+ ?& E& f& Jselect name, date, row_number() over (partition by name order by date)' [8 ~8 x y% s1 V1 ]# ?
from t0 V% i2 C Q: w
这将添加一个行号,在您的示例中该行号将简单地为1、2、3、4、5。现在,取与日期的差值,并且该组具有一个恒定值。
3 w+ G. ?1 {7 ?9 Xselect name, date,
6 T2 ^2 q4 Y" ?9 J: S dateadd(d, - row_number() over (partition by name order by date), date) as val( z8 C4 x# C: y$ f3 w9 ~
from t/ Q0 m& k5 |* m9 b8 @2 A* L
最后,您需要顺序的组数。我还将添加一个组标识符(例如,以区分最后两个)。
9 N9 h6 R, t/ d+ v- Dselect name, date,
- m& ?9 M, F4 i3 `6 f count(*) over (partition by name, val) as NumInSeq,0 q9 \& w4 F0 E6 ?
dense_rank() over (partition by name order by val) as SeqID
/ y2 S1 j7 O5 w9 |+ M8 t O/ @from (select name, date, N4 d i: h' \- M! ]6 m
dateadd(d, - row_number() over (partition by name order by date), date) as val+ q- J# D; K2 F' v- w( y4 F8 D w
from t) T! u, M& j2 @ i6 H
) t
8 f& c, @) l! z* D5 z+ w7 y不知何故,我错过了有关工作日和节假日的部分。此解决方案不能解决该问题。 |
|