Sql 获取每个指定组中第一次出现的结果
我在sql server 2012中有此查询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
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