回答

收藏

如何在SQL中识别连续日期组?

技术问答 技术问答 261 人阅读 | 0 人回复 | 2023-09-14

我试图写一个函数来识别日期组,并测量组的大小。
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不知何故,我错过了有关工作日和节假日的部分。此解决方案不能解决该问题。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则