|
我正在使用MS SQL Server 2008,并且我想这样做:4 Z$ H, |# G V/ {
+------+--------+--------+------------+
% X+ }, y3 ~. ?5 G| id | Name | Event | Timestamp |
% p9 i1 {; }0 X7 ~, c- N( k" [4 h+------+--------+--------+------------+
4 L$ b( z* M/ V: M| 0 | bob | note | 14:20 |
* M7 k& P# b( F! l6 g% E| 1 | bob | time | 14:22 |$ ?4 C* j$ A$ H2 O! L( n( K4 U& L
| 2 | bob | time | 14:40 |) H! k% y5 |# c. Y6 P# G" P- M
| 3 | bob | time | 14:45 |4 m/ v5 R0 ]/ W% y
| 4 | bob | send | 14:48 |
2 w4 r5 A0 X7 Y& D| 5 | bob | time | 15:30 |
! K$ F/ C+ e8 t7 _! J| 6 | bob | note | 15:35 |
0 ^1 B' o a9 f' X- c: V| 7 | bob | note | 18:00 |
* `1 q% V+ {$ L" g% O& Q+------+--------+--------+------------+7 A9 `+ f$ p/ |
要成为这个:
k7 b; V5 M. M+ t$ w7 r( G8 [+------+--------+--------+------------+* L3 P1 g2 F% a! i' r7 c4 R& ^
| id | Name | Event | Timestamp |2 M5 r9 y# V- Q$ C6 y
+------+--------+--------+------------+
0 o% r# _" J ^| 0 | bob | note | 14:20 |' ?3 K) G$ Y/ E: C9 |
| 1 | bob | time | 14:22 |. ]0 l2 z0 k1 u7 _- C9 a
| 4 | bob | send | 14:48 |
$ N. _/ f$ z# T5 k6 o# o| 5 | bob | time | 15:30 |
" D2 O s; b, L% o' [' R W; g| 6 | bob | note | 15:35 |. [; o: Y x! D O3 g* [6 s' }
+------+--------+--------+------------+' F f3 y/ Y3 K4 e$ M: i
即,行由“事件”列“分组”。每个 分组的 相同“事件”中仅显示一个。
K) J* Z! a. v# {9 q* s% I如果一个事件(例如ID为0的“ note”)在表中没有紧靠其前后(具有最近时间戳记的行)的行,且具有相等的“ event”值,则显示该事件;
F& k. S( k! s) H& Q. a' H0 e如果同一事件有多个行,例如ID为1-3的“时间”。出现在彼此之后(即没有带有不同“事件”的行具有在它们之间的时间戳),它们中的任何一个都被显示(对我而言无关紧要,所有其他列都是相同的)。
# m8 U9 J |5 W4 ^9 K+ g8 e1 q# T2 P
这两个是唯一的规则。
4 \) c7 E$ V* D g* F + d# g9 t3 q& A- n1 O
解决方案:
- ~3 g- ^* `5 g4 H( i& |! N1 m
: s1 j/ @- A' j# Z+ V9 P/ V% o- X. {7 i0 S
! V- ?+ y8 l+ x7 ?2 { 如果ids是一个接一个的尝试,请按照以下方式进行操作:
6 ^1 `6 V0 `3 k dselect * into #tab from(' N" [; U1 V; ]/ A& c- y
select 0 as id, 'bob' as name, 'note' as event, '14:20' as time union4 w, f4 I% n; c2 \+ m0 {, w
select 1, 'bob', 'time', '14:22' union3 S# o j; \6 l* e% V# J) ~+ t
select 2, 'bob', 'time', '14:40' union
: o2 U/ A$ X9 I/ W4 T+ f F4 A select 3, 'bob', 'time', '14:45' union. a% t) B2 u- o
select 4, 'bob', 'send', '14:48' union" Q, H M! L- \" B4 Z9 z
select 5, 'bob', 'time', '15:30' union& f: @4 _9 J$ e
select 6, 'bob', 'note', '15:35' union: {2 X6 h. l1 f& o% L
select 7, 'bob', 'note', '18:00'
: q. m/ A3 J1 n! g x7 a' ?) t
2 P" Z7 @6 K8 ]4 C0 T3 F9 zselect t.*
; _& P* f5 g* g3 b Hfrom #tab t' c! \, Q7 x- x! S
left join #tab t1 on t.id = t1.id + 1 and t1.event = t.event , z4 B2 r- m- s
-- and t1.name = t.name -- if there are more names you are going to need this one as well. M3 a9 P+ n6 Z& P( g" }
where t1.id is null! E5 Y% I+ n& z
结果:
' r7 R8 U; K& `2 f3 Eid name event time
0 f5 v& c) {+ |) Z# z9 b J0 bob note 14:200 w D+ I8 s& W; v
1 bob time 14:22) {- d0 h) n6 K! {' W3 ^6 i
4 bob send 14:48' V- g' j7 I" v2 {, i
5 bob time 15:30
& P' [& N+ B2 l. N6 bob note 15:35
! q) O1 i! k6 D4 o+ U! q. ~- g添加:
3 B; {5 i$ `, H6 r* I# w) u8 T如果ids不是一个接一个的,则可以使它们成为:& w7 h9 H. _2 S* E7 y
select identity(int, 1, 1) as id, name, event, time
' m6 A% [4 T6 _$ y7 \2 kinto #tab_ordered_ids) k; ]; e3 E$ S; |; `' _- q
from #tab order by name, id, time |
|