|
我有这样一张slots桌子:
$ z# A) U6 ]( E/ w& S% Q( Y6 ? Column | Type |
5 Z5 @- l9 I- h2 Y u1 ?------------+-----------------------------+
) }9 N) s/ q: U) N" R8 _! ~7 m id | integer |
4 O! z3 }3 S% d/ P0 p2 } begin_at | timestamp without time zone |
. k, \9 ~3 B/ F9 i end_at | timestamp without time zone | r5 R0 v/ \, e# z* ~* ?% _
user_id | integer |3 Y. ~$ z5 W) f8 N
而且我想选择连续的合并行。假设我有(简化)的资料,例如:# M0 w. [) |/ t$ g4 T' O* D! {
(1, 5:15, 5:30, 1)
8 e* _3 M. q6 P! C9 W8 V(2, 5:15, 5:30, 2)
0 `# ~2 D# v1 i(3, 5:30, 5:45, 2)
9 H! c! A4 k q: n4 s(4, 5:45, 6:00, 2)
' ^: v7 a v' m(5, 8:15, 8:30, 2)4 ?$ T% \" R% b) Z# I
(6, 8:30, 8:45, 2)
% s& G+ j; H4 o5 A, L) ]我想知道是否可以选择格式如下的行:
: q! Y! _+ g) U9 ^) \7 ](5:15, 5:30, 1)
& v7 b& k0 z8 a# M4 u(5:15, 6:00, 2) // 编辑: 这是SQLfiddle; X, N# T+ `6 B5 ?6 l: U
我正在使用9.3版的Postgresql!. K$ [; a3 p, e. }' D
谢谢!
' ]2 N0 E0 q+ H( h7 r7 m) x1 M 5 o; n# J5 T% Y8 }5 c( P4 F+ }
解决方案:
~8 B1 H+ S8 i4 H9 Z
* W% f& \8 L* [% F/ h
! w5 Q# l2 e$ W. |0 q3 r+ h1 S1 @
, N, _4 i, D- a 这是解决此问题的一种方法。创建确定是否一个纪录做了标志 不 重叠的前一个。这是一个小组的开始。然后取该标志的累积总和并将其用于分组:2 g7 ~! O; L% V3 [
select user_id, min(begin_at) as begin_at, max(end_at) as end_at* A% H7 k2 b9 K$ k& Z. J
from (select s.*, sum(startflag) over (partition by user_id order by begin_at) as grp
, a) ^- D( [8 T" q4 Z8 ? from (select s.*,
7 Y- M7 Z& G U% _* z* [ (case when lag(end_at) over (partition by user_id order by begin_at) >= begin_at
0 {6 P2 R W- q' p then 0 else 1
2 d% b2 _- x/ H+ @- ^- A" Y end) as startflag
+ S0 U/ G$ J8 n$ |. R, ^! t6 ` from slots s
& C+ X4 ]( ]# U0 p ) s: P1 O3 u' X5 {0 Y! K
) s% |/ b' o, ?, @- i, a
group by user_id, grp;1 C0 ] T/ A; Q& F0 x, Q
这是一个SQL Fiddle。 |
|