Получить первый вхождение результата в каждой указанной группе
У меня есть этот запрос в 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