1

我有一个带有visitor_id、country、time_of_visit 的mysql 表。

我想按国家/地区获得平均访问时间。

为了获得持续时间,我得到了每个 visitor_id 的最早和最晚 time_of_visit 之间的差异。

所以这让我得到了所有访问的平均持续时间:

    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

这样可行。但是按国家分组,我失败了。这是我最近尝试按国家/地区获取平均持续时间:

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

我得到的错误是:“字段列表”中的未知列“国家”。

我认为这应该很简单,但我是菜鸟。我搜索了很多,尝试了很多想法,但都不好。有什么帮助吗?

提前致谢。

4

3 回答 3

0

您需要在子查询中指定要在外部查询中显示的列试试这个::

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

你也可以试试:

SELECT 
country, 
AVG(TIMESTAMPDIFF(SECOND, MIN(time_of_visit), MAX(time_of_visit))/60) as avgTime
FROM 
GROUP BY visitor_id,country
于 2013-08-13T08:42:19.000 回答
0

您应该将 COUNTRY 添加到内部 GROUP BY 和字段列表

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
于 2013-08-13T08:44:38.293 回答
0

您必须在子查询中选择国家/地区列,然后必须从派生表中引用国家/地区字段 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

编辑

GROUP BY在 subselect 中使用visitor_id将为您提供包含国家/地区重复数据的记录,并且当GROUP BY与两者一起 使用时,visitor_id,country将在同一访客 ID 中对国家/地区的数据进行分组,这只有在一位访客属于多个国家/地区时才有可能,如果一位访客属于只有一个国家,即一对一的关系,然后只需使用GROUP BY visitor_id

于 2013-08-13T08:45:53.203 回答