Sql 获取每个指定组中第一次出现的结果

Sql 获取每个指定组中第一次出现的结果,sql,sql-server,sql-server-2012,ranking-functions,Sql,Sql Server,Sql Server 2012,Ranking Functions,我在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

我在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;
它得到了这个结果 出去

用户编号媒体编号月份名称 9月5日至1日 10月2日至1日 10月1日 8月1日 但我只需要octuber月的第一次出现

作为

用户编号媒体编号月份名称 9月5日至1日 10月2日至1日 8月1日
您只需要使用排序函数,如。使用它按
month\u name
对分区中的记录进行编号,并仅选择每个分区中编号为1的记录,即

将其添加到查询的选择列表中:

ROW_NUMBER() OVER(PARTITION BY month_name ORDER By XXX) as RowNumber
这将使用连续数字对具有相同
month\u 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
注意:如果您需要在结果中进行排序,您必须将
顺序
从子选择中移出,并将其写在
旁边,其中Q.RowNumber=1

已添加为“datename(mm,answer\u datetime)”
ROW_NUMBER() OVER(PARTITION BY month_name ORDER By XXX) as RowNumber
SELECT Q.user_number, Q.media_number, Q.month_name
FROM(
   -- your query + RowNumber) Q
WHERE Q.RowNumber = 1