1

我在 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 10 月 1 日

1 10 月 1 日

1 8 月 1 日

但我只需要十月的第一次出现

作为

user_number media_number month_name

5 月 1 日

2 10 月 1 日

1 8 月 1 日

4

1 回答 1

2

您只需要使用像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

于 2014-10-07T08:01:34.693 回答