|
(PostgreSQL 8.4) 表“
( u$ K+ H4 l4 `% P |trackingMessages存储移动设备(tm_nl_mobileid)和固定设备(tm_nl_fixedId)跟踪事件之间。
! }; h* r: c8 g$ k* uCREATE TABLE trackingMessages( tm_id SERIAL PRIMARY KEY, -- PK tm_nl_mobileId INTEGER, -- FK to mobile tm_nl_fixedId INTEGER, -- FK to fixed tm_date INTEGER, -- Network time tm_messageType INTEGER, -- 0=disconnect,1=connect CONSTRAINT tm_unique_row UNIQUE (tm_nl_mobileId,tm_nl_fixedId,tm_date,tm_messageType));这里的问题是,同一个移动设备可能会连接到同一个固定设备两次(或多次)。我不想看到后续的固定设备,但如果将来有连接到另一个固定设备的移动设备,以后可以连接到同一个固定设备。
' N) k; ]; n, g- j h我觉得我很亲密,但还不完整。我一直在使用以下内容CTE(可在Stack Overflow上找到)# K/ p, E P( e% I, c7 B9 b& [! g
WITH cte AS ( SELECT tm_nl_fixedid,tm_date,Row_number() OVER partition BY tm_nl_fixedid ORDER BY tm_date ASC ) RN FROM trackingMessages) SELECT * FROM cte WHERE tm_nl_mobileid = 150 AND tm_messagetype = 1 ORDER BY tm_date;给我以下结果7 L/ z4 x% S& a( n* ]4 u- L
32.1316538756;121;1316539069;132;1316539194;232;131653921;321;1316539235;232;这里的问题是最后一列应该是1、1、1、2、1,因为第三个 32实际上是一个重复的跟踪事件(连续两次在同一固定位置),最后一个连接到! X. h6 G T& h* v8 S# M% {% l
可以,因为介于两者之间。; p' [8 z$ j* d1 w- _8 w% o2 ?
不建议使用游标,, _8 ?! q( d, O8 Q% [2 |, f8 m
这是我目前正在努力摆脱的目标。游标解决方案确实有效,但考虑到我必须处理的记录量,太慢了。我宁愿修理它CTE,只选位置RN =1…,除非你有更好的想法!
1 T7 _: u1 f2 C
& c# m! K5 R2 L9 j* C1 o 解决方案:
6 o6 B- y) [# }. {8 K 嗯,你没那么亲密,因为row_number()无法同时跟踪两组的序列。PARTITION BY tm_nl_fixedid ORDER BYdate RESTART ON GAP不存在,没有这样的东西。
8 ]2 X& T5 H* ^8 \0 w' IItzik Ben-2 A0 T- L# o6 _1 R- Y
Gan它为您面临的岛屿和间隙问题提供了一个解决方案(实际上是几个解决方案)。想法是根据主要条件(日期)对行进行排序,然后根据划分条件 主要条件对行进行排序。由于它们属于相同的分区标准和日期系列,序号之间的差异将保持不变。
# C" y+ P0 @# L/ [' iwith cte as( select *, -- While order by date and order by something-else,date -- run along,they belong to the same sequence row_number() over (order by tm_date) - row_number() over (order by tm_nl_fixedid,tm_date) grp from trackingMessages)select *, -- Now we can get ordinal number grouped by each sequence row_number() over (partition by tm_nl_fixedid,grp order by tm_date) rn from cte order by tm_date有示例Sql Fiddle。0 g% Y+ e- p! R$ g9 o. N* }) ]
这是Sql Server MVP Deep' U' b2 y9 z# X1 |" u
Divs第五章提供了一些解决孤岛和空白问题的方法。 |
|