2017-03-24 144 views
0

我有URL一長串看着歷史存儲在具有以下屬性表:計算前10注視着每天的URL和每週平均

時間戳:時間戳當廣告被觀看

範疇: URL類別,字符串,例如 '家', '圖片' 等

網址:網址

時間:花了多長時間來服務的URL。

有每個URL多個記錄

我需要拿出,列出了每個類別的前10名觀看網址以下的輸出:

URL  Category  Last Days Average Duration Last Weeks Average Duration 

理想我寧願沒有創造一個函數/觸發器。我正在研究CTE和分組集。

一些示例數據將是:

2017-03-01,'Home','www.url.com/home.php',50 
2017-03-03,'Images','www.img.com/image.jpg',70 
2017-03-01,'Home','www.net.com/home.php',60 
2017-03-10,'Home','www.url.com/home.php',50 

示例輸出可能是:

前10名的URL與類別和最後一天的和上週的平均

+1

**您的問題,並添加一些樣本數據和基於該數據的預期輸出。 [**格式化文本**](http://stackoverflow.com/help/formatting)請,[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload圖像-的代碼上那麼當-要價-A-問題/ 285557#285557) –

回答

0

考慮爲降秩的DENSE_RANK()窗函數類別發自持續時間。順便說一下,這是一個非常常見的SQL問題,即使它有自己的標籤,greatest-n-per-group

SELECT main.* 
FROM 
    (SELECT t.Timestamp, t.Category, t.URL, t.Duration, 
      DENSE_RANK() OVER(PARTITION BY t.Category ORDER BY t.Duration DESC) AS 'Rank' 
    FROM myTable t) AS main 
WHERE main.Rank <= 10 

而對於無窗功能SQL數據庫(如果你曾經遷移平臺),使用count相關子查詢這在所有RDBMS的工作雖然不是最有效的。但是,重複RANK而不是DENSE_RANK

SELECT main.* 
FROM 
    (SELECT t.Timestamp, t.Category, t.URL, t.Duration, 
      (SELECT Count(*) FROM mytable sub 
      WHERE sub.Category = t.Category AND sub.Duration >= t.Duration) AS Rank 
    FROM myTable t) AS main 
WHERE main.Rank <= 10