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 9月1日

2 10月1日

1 10月1日

1 1 8月

しかし、10月の最初の出現だけが必要です

なので

user_number media_number month_name

5 9月1日

2 10月1日

1 1 8月

4

1 に答える 1

2

ROW_NUMBER()のようなランキング関数を使用するだけです。これを使用して、 によって分割されmonth_nameたレコードに番号を付け、各パーティションで番号 1 のレコードのみを選択します。つまり、

これをクエリの選択リストに追加します。

ROW_NUMBER() OVER(PARTITION BY month_name ORDER By XXX) as RowNumber

これは、month_name1 から始まり、 で指定された順序で、連続した番号で同じ行に番号を付けますXXX

注: XXX で順序を指定して、どの月の行が 1 番目であり、クエリによって返されるかを決定します。

次に、結果のクエリから選択を行い、次でフィルタリングします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 に答える