SQLITE несколько значений строки в столбцы - PullRequest
0 голосов
/ 12 апреля 2019

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

текущие данные таблицы:

eventable:

EVENT       EVENTNAME       EVENTACTION     STATUS      TIMESTAMP
"Event1"    "FootBall"      "FootBall0"     "started"   "1554980085"
"Event1"    "TableTennis"   "TT0"           "started"   "1554980086"
"Event1"    "FootBall"      "FootBall0"     "success"   "1554980087"
"Event1"    "Chess"         "CHESS0"        "success"   "1554980095"
"Event1"    "TableTennis"   "TT0"           "running"   "1554980189"
"Event1"    "FootBall"      "FootBall1"     "started"   "1554980082"

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

EVENT       EVENTNAME       EVENTACTION     STATUS      STARTTIME   RUNNINGTIME ENDTIME
"Event1"    "FootBall"      "FootBall0"     "success"   1554980085  NULL        1554980087
"Event1"    "TableTennis"   "TT0"           "running"   1554980086  1554980189  NULL 
"Event1"    "Chess"         "CHESS0"        "success"   1554980098  NULL        1554980100

Мне нужно показать EVENT, EVENTNAME, EVENTACTION и самую последнюю STATUS и отметку времениstarted, running и success, если время отсутствует, следует установить NULL.

Я использовал запрос SELECT с регистром, но метки времени не помещаются в одну соответствующую строку.

SELECT AE.EVENT,
AE.EVENTNAME,
AE.EVENTACTION,
AE.STATUS,
(case WHEN AE.STATUS='started' THEN AE.timestamp END) as starttime,
(case WHEN AE.STATUS='running' THEN AE.timestamp END) as runningtime,
(case WHEN AE.STATUS in ('success','failed') THEN AE.timestamp END) as endtime
FROM agentEvents AE 
ORDER by timestamp ASC

Любые выводы.

1 Ответ

0 голосов
/ 12 апреля 2019

Вам нужно агрегировать по событию, а затем взять MAX выражений CASE:

SELECT
    AE.EVENT,
    AE.EVENTNAME,
    AE.EVENTACTION,
    MAX(CASE WHEN AE.STATUS = 'started' THEN AE.timestamp END) AS starttime,
    MAX(CASE WHEN AE.STATUS = 'running' THEN AE.timestamp END) AS runningtime,
    MAX(CASE WHEN AE.STATUS IN ('success', 'failed') THEN AE.timestamp END) AS endtime
FROM agentEvents AE
GROUP BY
    AE.EVENT,
    AE.EVENTNAME,
    AE.EVENTACTION
ORDER BY
    MAX(CASE WHEN AE.STATUS = 'started' THEN AE.timestamp END);

Обратите внимание, что нет смысла упорядочивать только по столбцу timestamp, посколькуон больше не существует после агрегации.Итак, я заказываю вместо времени начала.Также нет смысла выбирать столбец STATUS, поэтому я удалил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...