(PostgreSQL 8.4) 表“trackingMessages”存储移动设备 (tm_nl_mobileid) 和固定设备 (tm_nl_fixedId) 之间的跟踪事件。
CREATE 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)
);
这里的问题是,同一台手机可能随后会连接到同一台固定设备两次(或更多次)。我不想看到后面的那些,但是可以在以后看到移动设备连接到同一个固定设备,前提是两者之间有不同的固定设备连接。
我想我很接近但不完全。我一直在使用以下 CTE(在 Stack Overflow 上找到)
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;
给我以下结果
32;1316538756;1
21;1316539069;1
32;1316539194;2
32;1316539221;3
21;1316539235;2
这里的问题是最后一列应该是 1, 1, 1, 2, 1,因为第三个“32”实际上是一个重复的跟踪事件(在同一行中固定两次)并且最后一个连接到“21 " 是可以的,因为 "32" 介于两者之间。
请不要建议使用光标,这是我目前试图摆脱的。游标解决方案确实有效,但考虑到我必须处理的记录数量,它太慢了。我宁愿修复 CTE,只选择哪里RN = 1
……除非你有更好的主意!