2017-04-14 52 views
0

我有一個包含解析的Apache日誌行的SQLite數據庫。從結果集中的組中獲取具有最高SELECT COUNT的行

數據庫的唯一表(訪問)的簡化版本是這樣的:

|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 
         ) 
       ); 

上述方法有效,但只要我查詢的日期範圍分崩離析。 如何通過日期實現分組?我也只對最高的推薦人感興趣。

+0

你想按日期範圍而不是單一日期進行分組? –

+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 
       ); 
+0

謝謝戈登。 LIMIT看起來很有用,但您的查詢只輸出一個結果。我正在尋找每個日期的計數/推薦人組合。 (多行) –

+0

你的第二種方法看起來很有前途。我還沒有完全理解它,但乍一看似乎產生了我需要的東西。謝謝! –

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表達式的值創建單個存儲桶來聚合原始數據。

相關問題