回答

收藏

如果某些列值在SQL中紧接在后,则将行分组

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

我正在使用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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则