/ / Sous-requête MySql: différence moyenne, groupée par colonne - mysql, sql, group-by, sous-requête

Sous-requête MySql: différence moyenne, groupée par colonne - mysql, sql, group-by, sous-requête

J'ai une table mysql avec visitor_id, pays, time_of_visit.

Je souhaite connaître la durée moyenne de visite par pays.

Pour obtenir la durée, j'obtiens la différence entre le plus tôt et le dernier time_of_visit pour chaque visiteur_id.

Cela me donne donc la durée moyenne de toutes les visites:

    SELECT AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration
FROM tracker
GROUP BY visitor_id
) as tracker

Ça marche. Mais grouper par pays, j'échoue. Voici ma dernière tentative pour obtenir une durée moyenne par pays:

SELECT country, AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration
FROM tracker
GROUP BY visitor_id
) as tracker
GROUP BY country

L'erreur que j'obtiens est la suivante: colonne inconnue "pays" dans la "liste de champs".

Je pense que cela devrait être simple, mais je ne suis pas un bonhomme. J'ai beaucoup cherché, essayé beaucoup d’idées, mais rien de bon. Toute aide?

Merci d'avance.

Réponses:

0 pour la réponse № 1

Vous devez sélectionner la colonne de pays dans votre sous-requête, puis référencer le champ de pays à partir de la table dérivée. tracker.country

SELECT tracker.country, AVG(tracker.duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration ,country
FROM tracker
GROUP BY visitor_id
) as tracker
GROUP BY tracker.country

modifier

En utilisant GROUP BY en sous-sélection visitor_id Will vous donne le record avec des données en double pour les pays et lors de l'utilisation GROUP BY avec les deux visitor_id,country regroupera les données des pays au sein de lamême Identifiant de visiteur, cela ne sera possible que si un visiteur appartient à plus d'un pays, si un visiteur appartiendra à un seul pays c'est-à-dire une relation un à un, il suffit d'utiliser GROUP BY visitor_id


0 pour la réponse № 2

Vous devez spécifier la colonne dans la sous-requête que vous souhaitez afficher dans la requête externe. Essaye ça::

SELECT country, AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration, country
FROM tracker
GROUP BY visitor_id
) as tracker
GROUP BY country

Vous pouvez aussi essayer:

SELECT
country,
AVG(TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60) as avgTime
FROM
GROUP BY visitor_id,country

0 pour la réponse № 3

Vous devez ajouter COUNTRY à GROUP BY interne et une liste de champs.

SELECT country, AVG(duration)
FROM
(
SELECT TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60
as duration,country,visitor_id
FROM tracker
GROUP BY visitor_id,country
) as tracker
GROUP BY country