从结果集中的组中获取具有最高SELECT COUNT的行

时间:2017-04-14 15:16:13

标签: sql sqlite

我有一个SQLite数据库,其中包含已解析的Apache日志行。

DB唯一的表(访问)的简化版本如下所示:

|referrer|datestamp|
+--------+---------+
|xy.de   | 20170414|
|ab.at   | 20170414|
|xy.de   | 20170414|
|xy.de   | 20170414|
|12.com  | 20170413|
|12.com  | 20170413|
|xy.de   | 20170413|
|12.com  | 20170413|
|12.com  | 20170412|
|xy.de   | 20170412|
|12.com  | 20170412|
|12.com  | 20170412|
|ab.at   | 20170412|
|ab.at   | 20170412|
|12.com  | 20170412|
+--------+---------+

我正在尝试通过执行在引荐来源上执行SELECT COUNT的子查询来检索每天的热门引荐来源。然后,我从该子查询中选择具有最高计数的条目:

SELECT datestamp, referrer, COUNT(*)
FROM accesses WHERE datestamp BETWEEN '20170414' AND '20170414'
GROUP BY referrer
HAVING COUNT(*) = (select MAX(anz) 
                   FROM (SELECT COUNT(*) anz 
                         FROM accesses
                         WHERE datestamp BETWEEN '20170414' AND '20170414'
                         GROUP BY referrer
                        )
                  );

只要我对单个日期执行查询,上述方法就会起作用,但只要我查询日期范围就会崩溃。 如何按日期分组?我也只对数量最多的推荐人感兴趣。

2 个答案:

答案 0 :(得分:2)

如果您希望所有日期与单个最佳推荐人相结合,那么:

SELECT referrer, COUNT(*) as anz 
FROM accesses
WHERE datestamp BETWEEN '20170414' AND '20170414'
GROUP BY referrer
ORDER BY COUNT(*) DESC
LIMIT 1;

我想你可能希望白天破解这些信息。如果是这样,相关的子查询有助于 - 以及CTE:

WITH dr as (
      SELECT a.datestamp, a.referrer, COUNT(*) as cnt
      FROM accesses a
      WHERE datestamp BETWEEN '20170414' AND '20170414'
      GROUP BY a.referrer, a.datestamp
     )
SELECT dr.*
FROM dr
WHERE dr.cnt = (SELECT MAX(dr2.cnt)
                FROM dr dr2
                WHERE dr2.datestamp = dr.datestamp
               );

答案 1 :(得分:1)

只按日期范围分组。例如,

SELECT referrer, 
   case when datestamp Between '20170101' AND '20170131' then 1
        when datestamp Between '20170201' AND '20170228' then 2
        when datestamp Between '20170301' AND '20170331' then 3
        else 4 end DateRange
   COUNT(*) as anz 
FROM accesses
GROUP BY referrer,
   case when datestamp Between '20170101' AND '20170131' then 1
        when datestamp Between '20170201' AND '20170228' then 2
        when datestamp Between '20170301' AND '20170331' then 3
        else 4 end
ORDER BY referrer, COUNT(*) DESC
LIMIT 1;

您可以将任何合法的SQL表达式放在group by子句中。这会导致查询处理器根据group by表达式的值创建单独的存储桶以聚合原始数据。