【问题标题】:Get the first occurence of the result in each specified group获取每个指定组中第一次出现的结果
【发布时间】:2014-10-07 07:48:27
【问题描述】:

我在 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 日

【问题讨论】:

  • 已经添加为“datename(mm,answer_datetime)”

标签: sql sql-server sql-server-2012 ranking-functions


【解决方案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 旁边

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 2014-07-15
    • 2021-10-30
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多