2010-01-20 6 views
4

J'ai une table qui stocke la page frappe sur une application Web, le stockageSQL - joindre deux sql séparés requêtes

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 

Je veux exécuter une requête SQL qui va me montrer la page la plus commune que les utilisateurs fin de la navigation. Donc, mon idée initiale est que dans mon application (java), je peux lancer une requête qui va sélectionner les valeurs distinctes de http_session_id de la table, puis pour chaque session http_session_id distincte, exécuter une autre requête qui obtient la page avec le ' dernier 'page_hit_timestamp, et additionne le total de toutes ces pages. (Pour les exemples de données ci-dessus, j'aurais un compte de 2 pour info.html et un compte de 1 pour faq.html.)

Mais, ce que je voudrais savoir est: est-il façon de combiner ces deux requêtes en une seule instruction SQL - ou devrais-je descendre la route de la procédure stockée pour cela?

J'ai jeté un œil sur l'utilisation de join, mais je ne peux pas déterminer si c'est applicable dans ce scénario. PS - Je sais que je pourrais utiliser les goûts de Google Analytics dans mon application pour fournir cette information pour moi, mais a) c'est une application web mobile donc pas génial pour les outils d'analyse sur étagère, et b) I ' Je suis juste curieux de savoir si cela peut être fait en SQL.

+0

BTW - J'utilise Oracle 9g (en prod), mais je voudrais avoir une syntaxe SQL générique pour que je puisse aussi utiliser MySQL dans mon environnement de développement. – Kevin

+3

Première question: POURQUOI? analyser les journaux de votre serveur Web pour obtenir cette information. Vous n'avez pas besoin d'utiliser Google Analytics ou une application similaire pour obtenir cette fonctionnalité, ni d'écrire quoi que ce soit. Les journaux de vos serveurs sont beaucoup plus détaillés et vous ne subissez pas de pénalité de performance deux fois (c'est-à-dire que le serveur le fait une fois, et vous le faites une seconde fois). –

+0

Salut David - une question raisonnable. La principale raison de lancer la mienne ici est une restriction des données que j'ai à fournir.Il est beaucoup plus facile d'exécuter une requête sur les données auxquelles j'ai accès que de passer par le processus de configuration d'access_log et d'outils pour l'analyser: l'environnement serveur est géré par le centre de données d'entreprise et le changement n'est pas trop rapide. De plus, les journaux de base de données actuels fournissent d'autres pépites d'informations qui ne seraient pas disponibles dans access_log. – Kevin

Répondre

5

Cela devrait faire ce que vous voulez:

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 - Merci pour une réponse étonnamment rapide. Je devais juste ajouter "comme page_hit_timestamp" dans votre jointure interne pour que cela fonctionne. – Kevin

+0

À droite, j'oublie toujours que lors du codage de la mémoire :) – RedFilter

0

Pouvez-vous fournir vos deux requêtes, je pourrais les transformer en JOIN pour vous facilement, ou éventuellement une sous-requête en fonction de vos besoins.

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

Cela renverra une ligne pour chaque http_session_id et page_name combinaison, et cette ligne contiendra:

  • http_session_id
  • page_name
  • le nombre de fois le (http_session_id + nom_page) combinaison se produit dans la table
  • la dernière (MAX) horodatage pour la combinaison
+0

Merci - pas exactement ce dont j'ai besoin, mais cette requête me donne des indices pour le travail futur que je dois faire. – Kevin

0

La requête ci-dessous répertorie les dernières pages consultées,

 
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; 


si vous voulez compter, alors la requête ci-dessous peut aider

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;