mysql - SQL查询查找最小字段最常见的索引

标签 mysql sql

我有一个跟踪多个网站事件的表格。每行的形式如下:(日期、时间、网站、点击量) “小时”字段是 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/

相关文章:

SQL - 查找去年未订购的客户以及他们订购的商品

sql - 如何在SQL Server 2005中调用表值函数中的存储过程?

php - 如何从一个表中计算每个用户的最佳排名,并使用结果插入/更新另一个表

java - 更新在 init() 内部初始化的 Map 对象以及来自 sql 表的值

mysql - 从列名中删除后缀

sql替换两个字符串之间的所有字符

mysql - 同一张表上的多个连接

mysql - 是否可以锁定表以插入所选值

php - 使用 PHP 创建 html 表

mysql - 更新后重新加载 vagrant