2009-11-09 84 views
2

我正在嘗試執行某些操作,但我不確定如何執行此操作。對於查詢中的每一行,從其他查詢中選擇前20位

我有一些數據是這樣的:

WITH a AS (SELECT theid, thename, thetimestamp FROM mytable) 
SELECT thename, TRUNC (thetimestamp, 'HH24'), COUNT (theid) FROM a 
group by thename,trunc(thetimestamp,'HH24') ORDER BY COUNT (theid) desc) 

返回我按小時和名稱分組計數。

我想這僅僅是

for each hour, top X counts 

這可能嗎?


我結束了:

SELECT thename, hour, cnt 
FROM 
(SELECT thename, hour, cnt, 
     rank() over (partition by hours order by cnt desc) rnk 
    FROM 
    (SELECT thename, TRUNC (thetimestamp, 'HH24') hour, COUNT (theid) cnt 
    FROM mytable 
    group by thename,trunc(thetimestamp,'HH24') 
) 
) 
WHERE rnk <= :X 

回答

3

嘗試:

SELECT thename, hour, cnt 
FROM 
(SELECT thename, hour, cnt, 
     rank() over (partition by thename order by cnt desc) rnk 
    FROM 
    (SELECT thename, TRUNC (thetimestamp, 'HH24') hour, COUNT (theid) cnt 
    FROM mytable 
    group by thename,trunc(thetimestamp,'HH24') 
) 
) 
WHERE rnk <= :X 

(我沒看到的WITH子句的目的,所以我從我刪除它)。

+0

我刪除了(通過thename分區,以便通過CNT DESC)的「逗號」,我需要按小時而不是thename但在其他方面完美partion ! – svrist 2009-11-09 14:31:46

+0

糟糕,現在修復了。謝謝。 – 2009-11-09 14:48:04

2

你可以用row_number()來做到這一點,但它需要另一個子查詢或另一個CTE。這裏的雙CTE,因爲託尼Adrews已經發布的子查詢方法:

WITH a AS (
    SELECT thename, TRUNC(thetimestamp, 'HH24') as hour, COUNT(*) cnt 
    FROM mytable 
    GROUP BY thename, TRUNC(thetimestamp, 'HH24') 
), b AS (
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY hour ORDER BY ctn DESC) rn, 
     thename, hour, cnt 
    FROM a 
) 
SELECT * 
FROM b 
WHERE rn < 20 
+0

在我的to蛤蟆,我需要改變「Rownumber(....)」到「Rownumber()over(...」),否則作爲一種魅力。Tony贏得西部最快的槍支,雖然 – svrist 2009-11-09 14:33:17

+0

@svrist:檢查,我會編輯答案 – Andomar 2009-11-09 14:37:54