(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 (найденный здесь, в переполнении стека)
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
... если у вас нет идеи получше!