Ссылка на другие строки при разборе select - PullRequest
0 голосов
/ 25 апреля 2018

Я не очень разбираюсь в SQL, и у меня есть задача с довольно сложным вариантом использования.Я переносу информацию из старого формата базы данных в новый, более легко дешифруемый формат, полученный из домена.

У меня есть таблица в старой базе данных, которую я должен проанализировать следующим образом:

Первая строка в таблице ниже показывает, когда система переходит в состояние.Вторая строка показывает, когда введенное состояние покинуло и перешло в другое.Тип состояния указывается в столбце состояния.

+--------------------------------------+-------------------------+-------------------+-------------+------+-------+
|                 uuid                 |        timestamp        |        mac        | trans_count | type | state |
+--------------------------------------+-------------------------+-------------------+-------------+------+-------+
| 66278266-9727-4d2c-be3f-5a84504bfb90 | 2011-09-26 08:52:57:000 | 00:60:e0:4e:5d:91 |           1 |    0 |     1 |
| 31ff112c-f11b-41c3-b5c2-08ea9e84415a | 2011-09-26 08:53:06:000 | 00:60:e0:4e:5d:91 |           2 |    0 |     0 |
| 88d671c8-8ff7-4bf3-9e58-c7ced815c454 | 2011-09-26 08:53:57:000 | 00:60:e0:4e:5d:91 |           3 |    1 |     1 |
+--------------------------------------+-------------------------+-------------------+-------------+------+-------+

Итак, что я хочу достичь программным способом, это то, что эти три строки должны быть объединены в две:

+--------------------------------------+--------------------------+----------------------------+------+------------+
|                 uuid                 |          enter           |            exit            | mode |   state    |
+--------------------------------------+--------------------------+----------------------------+------+------------+
| 09570915-d846-48db-ba87-e36c544383bb | 2011-09-26 08:52:57:000  | 2011-09-26 08:53:06:000    | SCO  | INITIATION |
| 2a472124-8ccb-46a4-9f84-cfcdf23a13d7 | 2011-09-26 08:53:06:000  | 2011-09-26 08:53:57:000 |  | SCO  | CLOSED     |
+--------------------------------------+--------------------------+----------------------------+------+------------+

первая строка в таблице выше имеет время ввода первой строки в первой таблице и время выхода второй строки в первой таблице.Вторая строка в новой таблице имеет время ввода второй строки в первой таблице и время выхода третьей строки.

Тип исостояния в первой таблице являются просто порядковыми номерами, которые я перевел в строковое представление, чтобы иметь возможность читать из базы данных более простым способом.

Я хотел бы просто указать на то, какие методы можно использовать,Я не могу дотронуться до исходной таблицы, но могу создать новые таблицы, чтобы отслеживать, что я уже обработал в той же базе данных.

Возможно получить набор результатов и ссылаться на следующие / предыдущие элементы в нем?Какой будет рекомендуемый подход?

1 Ответ

0 голосов
/ 26 апреля 2018

Итак, если кому-то интересно, вот как я это сделал:

select
    ss.UUID,
    ss."date" as "enter",
    coalesce(lat."date", ss."date") as "exit",
    ss."type" as "mode",
    ss.STATE,
    scs.CUSTOMER_ID as "session_id"
from
    STAT_CUSTOMER_SESSIONS scs,
    STAT_SESSION ss
left join lateral(
        select
            "date"
        from
            STAT_SESSION ss2,
            STAT_CUSTOMER_SESSIONS scs2
        where
            ss2."date" > ss."date"
            and scs2.SESSION_ID = ss2.UUID
            and scs2.CUSTOMER_ID = scs.CUSTOMER_ID
        order by
            ss2."date" asc limit 1
    ) lat on true
where
    scs.SESSION_ID = ss.UUID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...