2010-01-20 2 views
4

У меня есть таблица, которая хранит страницы попадает на веб-приложения, хранение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 запустит другой запрос, который получит страницу с " last 'page_hit_timestamp и суммировать общее количество всех этих страниц. (Для данных примера, приведенных выше, у меня будет счет 2 для info.html и число 1 для faq.html.)

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

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

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

+0

BTW - Я использую Oracle 9g (в prod), но хотел бы иметь общий синтаксис sql, поэтому я также могу запустить MySQL в своей среде dev. – Kevin

+3

Первый вопрос: ПОЧЕМУ? проанализируйте свои журналы веб-сервера, чтобы получить эту информацию. Вам не нужно использовать Google Analytics или подобное приложение для получения этой функции, и вам нечего писать. Журналы вашего сервера намного более подробные, и вы не подвергаете себя штрафу за выполнение этого дважды (то есть сервер делает это один раз, и вы делаете это второй раз). –

+0

Привет, Дэвид - разумный вопрос. Основная причина, по которой вы меняете, - это ограничение того, какие данные я должен иметь.Гораздо проще выполнить запрос по данным, к которым у меня есть доступ, чем пройти через процесс, создающий access_log и инструменты для его анализа - серверная среда управляется корпоративным центром обработки данных, и изменение не происходит слишком быстро. Кроме того, текущие журналы базы данных предоставляют некоторые другие самородки информации, которые не будут доступны в access_log. – Kevin

ответ

5

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

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 
+0

@OrbMan - Спасибо за поразительно быстрый ответ. Мне просто нужно было добавить «as page_hit_timestamp» в ваш выбор внутреннего соединения, чтобы заставить это работать. – Kevin

+0

Правильно, я всегда забываю, что при кодировании из памяти :) – RedFilter

0

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

3
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
  • PAGE_NAME
  • подсчет количества раз (http_session_id + page_nam е) сочетание происходит в таблице
  • последняя (MAX) метка времени для комбинации
+0

Спасибо - не совсем то, что мне нужно, но этот запрос дает мне некоторые подсказки для будущей работы, которую мне нужно сделать. – Kevin

0

Запрос ниже список последних посещенных страниц,

 
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; 
Смежные вопросы