SQL - групповые записи журнала сеансов и упорядочение групп по времени начала сеанса - PullRequest
2 голосов
/ 21 июня 2011

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

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


item_id  item_datetime      app action  session_id
1   2011-06-20 19:01:04     a   start   23B6C531-6D38-4E47-A887-10B945B48BD9
2   2011-06-20 19:01:05     b   start   7E6D0F55-4280-46DF-A829-F6821FF028D5
3   2011-06-20 19:03:45     b   job     7E6D0F55-4280-46DF-A829-F6821FF028D5
4   2011-06-20 19:09:33     a   job     23B6C531-6D38-4E47-A887-10B945B48BD9
5   2011-06-20 19:27:00     a   quit    23B6C531-6D38-4E47-A887-10B945B48BD9
6   2011-06-20 19:50:00     c   start   12345678-1234-4321-1234-109876543210
7   2011-06-20 19:50:01     c   quit    12345678-1234-4321-1234-109876543210
8   2011-06-20 19:50:22     b   quit    7E6D0F55-4280-46DF-A829-F6821FF028D5

В этом примере 3 разных приложения «a», «b» и «c» выполняются одновременно, причем каждый сеанс перекрывает другие. Что мне нужно, так это список, сгруппированный по сеансам, и сеансы (полученные группы) должны быть упорядочены по времени начала сеанса. Для приведенного выше примера таблицы, я ожидаю ниже результата:


item_id  item_datetime      app action  session_id
1   2011-06-20 19:01:04     a   start   23B6C531-6D38-4E47-A887-10B945B48BD9
4   2011-06-20 19:09:33     a   job     23B6C531-6D38-4E47-A887-10B945B48BD9
5   2011-06-20 19:27:00     a   quit    23B6C531-6D38-4E47-A887-10B945B48BD9

2   2011-06-20 19:01:05     b   start   7E6D0F55-4280-46DF-A829-F6821FF028D5
3   2011-06-20 19:03:45     b   job     7E6D0F55-4280-46DF-A829-F6821FF028D5
8   2011-06-20 19:50:22     b   quit    7E6D0F55-4280-46DF-A829-F6821FF028D5

6   2011-06-20 19:50:00     c   start   12345678-1234-4321-1234-109876543210
7   2011-06-20 19:50:01     c   quit    12345678-1234-4321-1234-109876543210

Я пытался сгруппировать с упорядочением по, но проблема в том, что сортировка результата основана на алфавитном порядке идентификаторов session_id - но это не то, что мне нужно, уникальность идентификатора сеанса - вот что важно, их «значение» делает не имеет значения.

Ответы [ 4 ]

2 голосов
/ 21 июня 2011

Вы можете использовать подзапрос, чтобы найти первую дату сеанса.Это позволяет заказать сеансы:

select  yt.item_id
,       yt.item_datetime
,       yt.app
,       yt.action
,       yt.session_id
from    (
        select  session_id
        ,       min(item_datetime) as MinDate
        from    YourTable
        group by
                session_id
        ) sessions
left join
        YourTable yt
on      yt.session_id = sessions.session_id
order by
        session.MinDate
,       yt.item_datetime
1 голос
/ 21 июня 2011

Мне кажется, что вы не хотите группировки, а только сортировки нет?Итак:

SELECT item_id,item_datetime,app,action,session_id
FROM Table
ORDER BY app,item_datetime
0 голосов
/ 21 июня 2011

Вы пробовали что-нибудь подобное?

SELECT
  *
FROM
  yourTable
ORDER BY
  app,
  session_id,
  item_datetime

Казалось бы, это то, что вы описали, хотя вы говорите, что пытались использовать просто ORDER BY?

0 голосов
/ 21 июня 2011

Просто добавьте предложение

ORDER BY `session_id` ASC , `item_datetime` ASC

к вашему SQL qyery

...