【问题标题】:SQL query to find the most common index of a minimal field [duplicate]SQL查询以查找最小字段的最常见索引[重复]
【发布时间】:2014-08-04 13:38:30
【问题描述】:

我有一张表格可以跟踪多个网站的活动。每行的格式如下:(日期、时间、网站、点击次数) Hour 字段是一个介于 0 和 23 之间的数字,代表一整小时(例如,22 表示 22:00 和 22:59 之间的任何点击)。

我想找出每个网站总体上最慢的时间,这意味着输入应该类似于 (Website, Hour)。

为了做到这一点,我想我应该有一个嵌套查询来找到每个网站每天的最低点击量,然后计算 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

但不仅计算需要异常长的时间,它还为每个小时的值提供了多个 (Date_t, Website_t, Hour, min(Hits)) 条目,所以我认为我没有这样做以最聪明,也不是最有效的方式。

提前感谢您的帮助!

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集
  • 发布您创建此类查询的最佳尝试,可能是伪代码。
  • 完成,希望没问题。
  • 这是greatest-n-per-group问题的变体,其中有很多MySQL的例子。

标签: mysql sql


【解决方案1】:

您可以使用 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
                 );

这被解释为:“从表中获取所有行,其中没有其他行具有相同的小时和较低的命中数。”这是一种迂回的说法:“给我一个最小值的小时。”请注意,当有平局时,这将返回多行。

【讨论】:

  • 我认为如果数据被规范化就不需要破解了,你可以从网站中选择 *,然后在列列表中使用子查询来返回匹配的最小小时条目。
  • @scragar 。 . . (1) 数据归一化。 (2) hack 并不是绝对必要的。 (3) 随意发布您自己的答案。
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多