Получить первый вхождение результата в каждой указанной группе

У меня есть этот запрос в SQL Server 2012

select sum(user_number),
  sum(media_number),
 month_name from (
select TOP 100
    count(distinct a.answer_group_guid) as 'user_number',
  count(distinct a.media_guid) as 'media_number',
 datename(mm,answer_datetime) as 'month_name' ,year(answer_datetime) as 'year'
from
    tb_answers as a
        left outer join
    tb_media as m ON m.user_guid = 'userguid' and m.media_guid=a.media_guid
where
 m.user_guid = 'userguid'

group by concat(year(answer_datetime),'',month(answer_datetime)),datename(mm,answer_datetime),year(answer_datetime)

order by  year(answer_datetime) desc) as aa

group by month_name,year
order by  month_name desc,year desc;

это получить этот результат

user_number media_number month_name

5 1 сентября

2 1 октября

1 1 октября

1 1 августа

Но мне нужен только первый октябрь месяц

как

user_number media_number month_name

5 1 сентября

2 1 октября

1 1 августа

1 ответ

Решение

Вам просто нужно использовать функцию ранжирования, например ROW_NUMBER (). Используйте его для нумерации записей, month_name и выберите только записи с номером 1 в каждом разделе, т.е.

Добавьте это в список выбора вашего запроса:

ROW_NUMBER() OVER(PARTITION BY month_name ORDER By XXX) as RowNumber

Это будет нумеровать строки, которые имеют одинаковые month_name с последовательными номерами, начиная с 1, и в порядке, указанном XXX,

ПРИМЕЧАНИЕ: укажите порядок в XXX, чтобы решить, какая из строк месяца является номером один и будет возвращена запросом

А затем сделайте выборку из полученного запроса, отфильтровав RowNumber = 1

SELECT Q.user_number, Q.media_number, Q.month_name
FROM(
   -- your query + RowNumber) Q
WHERE Q.RowNumber = 1

ПРИМЕЧАНИЕ: если вам нужен порядок в вашем результате, вам придется переместить ORDER BY из подпункта, и напишите его рядом с WHERE Q.RowNumber=1

Другие вопросы по тегам