SQL - объединить два отдельных SQL-запроса

У меня есть таблица, в которой хранятся обращения к страницам в веб-приложении, хранящие

unique_row_id  http_session_id  page_name   page_hit_timestamp
----------------------------------------------------------------
0              123456789        index.html  2010-01-20 15:00:00
1              123456789        info.html   2010-01-20 15:00:05
2              123456789        faq.html    2010-01-20 15:00:15
3              987654321        index.html  2010-01-20 16:00:00
4              987654321        faq.html    2010-01-20 16:00:05
5              987654321        info.html   2010-01-20 16:00:15
6              111111111        index.html  2010-01-20 16:01:00
7              111111111        faq.html    2010-01-20 16:01:05
8              111111111        info.html   2010-01-20 16:01:15

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

Итак, мое первоначальное мнение состоит в том, что в моем (java) приложении я могу запустить запрос, который будет выбирать отдельные значения http_session_id из таблицы, а затем для каждого отдельного http_session_id запускать другой запрос, который получает страницу с «самой последней» page_hit_timestamp, и суммировать общее количество всех этих страниц. (Для примера данных выше у меня будет счетчик 2 для info.html и счетчик 1 для faq.html.)

Но я хотел бы знать следующее: есть ли способ объединить эти два запроса в один оператор sql - или мне нужно будет пройти маршрут хранимой процедуры для этого?

Я рассмотрел использование соединения, но не могу понять, применимо ли оно в этом сценарии.

PS: я знаю, что мог бы использовать Google Analytics в своем приложении, чтобы предоставить мне эту информацию, но а) это мобильное веб-приложение, поэтому оно не подходит для готовых инструментов аналитики, и б) мне просто любопытно знать, можно ли это сделать в SQL.


person Kevin    schedule 20.01.2010    source источник
comment
Кстати, я использую Oracle 9g (в prod), но хотел бы иметь общий синтаксис sql, чтобы я также мог запускать MySQL в своей среде разработки.   -  person Kevin    schedule 21.01.2010
comment
Первый вопрос: ЗАЧЕМ? проанализируйте журналы вашего веб-сервера, чтобы получить эту информацию. Вам не нужно использовать Google Analytics или подобное приложение, чтобы получить эту функциональность, и вам не нужно ничего писать. Журналы вашего сервера намного более подробны, и вы не подвергаетесь снижению производительности, если делаете это дважды (т. е. сервер делает это один раз, а вы делаете это второй раз).   -  person 3Dave    schedule 21.01.2010
comment
Привет Давид - резонный вопрос. Основная причина, по которой я выкатываю здесь, — это ограничение на то, какие данные я должен передать. Гораздо проще выполнить запрос к данным, к которым у меня есть доступ, чем пройти через процесс настройки access_log и инструментов для его анализа — среда сервера управляется корпоративным центром обработки данных, и изменения происходят не слишком быстро. Кроме того, текущие журналы базы данных предоставляют некоторые другие фрагменты информации, которые не были бы доступны в access_log.   -  person Kevin    schedule 21.01.2010


Ответы (4)


Это должно делать то, что вы хотите:

select 1.page_name, count(*) as ExitPageCount
from WebLog l
inner join (
    select http_session_id, max(page_hit_timestamp)
    from WebLog
    group by session
) lm on l.http_session_id = lm.http_session_id and l.page_hit_timestamp = lm.page_hit_timestamp
group by 1.page_name
person D'Arcy Rittich    schedule 20.01.2010
comment
@OrbMan - Спасибо за поразительно быстрый ответ. Мне просто нужно было добавить как page_hit_timestamp в ваш внутренний выбор соединения, чтобы заставить это работать. - person Kevin; 21.01.2010
comment
Да, я всегда забываю об этом, когда кодирую по памяти :) - person D'Arcy Rittich; 21.01.2010

SELECT http_session_id, page_name, COUNT(page_name), MAX(page_hit_timestamp)
    FROM table
    GROUP BY http_session_id, page_name

Это вернет строку для каждой комбинации http_session_id и page_name, и эта строка будет содержать:

  • http_session_id
  • имя_страницы
  • подсчет того, сколько раз комбинация (http_session_id+page_name) встречается в таблице
  • последняя (MAX) метка времени для комбинации
person Bandi-T    schedule 20.01.2010
comment
Спасибо - не совсем то, что мне нужно, но этот запрос дает мне некоторые подсказки для будущей работы, которую мне нужно выполнить. - person Kevin; 21.01.2010

Можете ли вы предоставить свои два запроса, я мог бы легко превратить их в JOIN для вас или, возможно, в подзапрос в зависимости от ваших потребностей.

person MindStalker    schedule 20.01.2010

В приведенном ниже запросе перечислены последние посещенные страницы,

select http_session_id,page_name,page_hit_timestamp from 
(select row_number() over( partition by t.http_session_id order by t.page_hit_timestamp desc) rn,t.* from weblog t
) where rn=1;


если вы хотите подсчитать, вам может помочь приведенный ниже запрос

select page_name,count(*) from (select 
row_number() over( partition by t.http_session_id order by t.page_hit_timestamp desc) rn,t.* from weblog t
) where rn=1
group by page_name;
person Abdullah Dogan    schedule 21.01.2010