Для каждой строки в запросе выберите топ 20 из другого запроса - PullRequest
2 голосов
/ 09 ноября 2009

Я пытаюсь что-то сделать, и я не знаю, как это сделать.

У меня есть такие данные:

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

Ответы [ 2 ]

3 голосов
/ 09 ноября 2009

Попробуйте:

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, поэтому удалил его из своего).

2 голосов
/ 09 ноября 2009

Это можно сделать с помощью row_number (), но для этого требуется другой подзапрос или другой CTE. Вот двойной CTE, так как Тони Адрюс уже опубликовал подход подзапроса:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...