Мне кажется, что вопрос требует запроса, который вернул бы лучший и второй лучший в той же строке для каждого месяца и года, например:
month, year, best, second best
...
...
, а не две строки для одного и того же месяца и года, содержащие наилучшее и второе наилучшее значение.
Это решение, которое я придумал, поэтому, если у кого-то есть более простой способ достижения этого, я бы хотел знать.
with ranks as (
select
year(entrydate) as [year],
month(entrydate) as [month],
views,
rank() over (partition by year(entrydate), month(entrydate) order by views desc) as [rank]
from product
)
select
t1.year,
t1.month,
t1.views as [best],
t2.views as [second best]
from ranks t1
inner join ranks t2
on t1.year = t2.year
and t1.month = t2.month
and t1.rank = 1
and t2.rank = 2
РЕДАКТИРОВАТЬ: просто из любопытства я провел немного больше испытаний и в итоге получил более простой вариант ответа Стефани Пейдж *1000*, в котором не используется дополнительный подзапрос. И я изменил функцию rank () на row_number (), так как она не работает, когда два максимальных значения одинаковы.
with ranks as (
select
year(entrydate) as [year],
month(entrydate) as [month],
views,
row_number() over (partition by year(entrydate), month(entrydate) order by views desc) as [rank]
from product
)
select
t1.year,
t1.month,
max(case when t1.rank = 1 then t1.views else 0 end) as [best],
max(case when t1.rank = 2 then t1.views else 0 end) as [second best]
from
ranks t1
where
t1.rank in (1,2)
group by
t1.year, t1.month