我有一个跟踪多个网站事件的表格。每行的形式如下:(日期、时间、网站、点击量) “小时”字段是 0 到 23 之间的数字,代表一整小时(例如,22 表示 22:00 到 22:59 之间的任何点击)。
我想找到每个网站总体最慢的时间,这意味着输入应该类似于(网站,时间)。
为了做到这一点,我想我应该有一个嵌套查询来查找每天每个网站的最小点击量,然后计算 Hour 的值(同样,对于每天的每个网站),然后查看哪个值是最大值。
我对 SQL 还很陌生,所以我很难正确使用 min() 函数来查找特定日期和网站的最小值。然后我在对特定网站使用 count() 时遇到同样的问题。
我也很好奇我是否不仅可以得到最常见的最慢小时,还可以得到最慢的 3 个小时,但至少对我来说,这似乎让问题变得更加复杂。
对于第一个嵌套查询,我考虑了这样的事情:
SELECT DISTINCT Date Date_t, Website Website_t, Hour,
(SELECT min(Hits) from HITS_TABLE WHERE Date=Date_t and Website=Website_t) as MinHits
FROM HITS_TABLE
但不仅需要异常长的时间来计算,它还为每个 Hour 值提供了多个条目 (Date_t, Website_t, Hour, min(Hits)),所以我认为我没有这样做以最聪明的方式,但也不是最有效的方式。
预先感谢您的帮助!
最佳答案
您可以使用 MySQL 中的技巧来获取最短小时数:
select website, substring_index(group_concat(hour order by hits), ',', 1) as minhour
from table t
group by website;
对于每个网站,这会构建一个以逗号分隔的小时列表,按点击次数排序。函数 substring_index()
返回第一行。
这是一种黑客行为。在大多数其他数据库中,您将使用窗口/分析函数,但这些函数在 MySQL 中不可用。
编辑:
您也可以在标准 SQL 中执行此操作:
select t.*
from table t
where not exists (select 1
from table t2
where t2.hour = t.hour and
t2.hits < t.hits
);
这被解释为:“从表中获取所有行,其中没有其他行具有相同的小时数和较低的点击数。”这是一种迂回的说法:“给我提供最小值的时间。”请注意,当存在平局时,这将返回多行。
关于mysql - SQL查询查找最小字段最常见的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24214726/