2016-12-17 2 views
1

私はスタックオーバーフローデータベースを作成しており、1年に最も人気のあるタグを使用したいと考えています。私が欲しいの出力は次のようになります。1年間に複数の値グループの間で最大値を取得する方法

2016 Java 123456 
2015 PHP 123456 
2014 Java 123456 
... ... ... 

私はこのクエリ作成してもらってください:

SELECT tagName, annee, max(nbApparitions) AS nbApparitions 
FROM 
    (SELECT tagName, 
    year(creationDate) AS annee, 
    count(tagName) AS nbApparitions 
    FROM tags 
    JOIN postTags 
    ON (tags.Id = postTags.tagId) 
    JOIN posts 
    ON (postTags.postId = posts.Id) 
    GROUP BY tagName, year(creationDate))Apparition 
GROUP BY tagName , annee 

をしかし、このクエリは、各年度のすべてのタグを返します。私はこれを作る方法を知らない。

+0

nbApparitionsで注文し、外部クエリの最初の行のみをフェッチすることができます。私はこれがSQL Serverのためにどのように書かれているのかわかりません。 – mm759

答えて

1

あなたはrow_number()を使用することができます。

SELECT tagname, annee, cnt 
FROM (SELECT t.tagName, year(creationDate) AS annee, 
      count(*) AS cnt, 
      ROW_NUMBER() OVER (PARTITION BY year(creationDate) ORDER BY COUNT(*) DESC) AS seqnum 
     FROM tags t JOIN 
      postTags pt 
      ON t.Id = pt.tagId JOIN 
      posts p 
      ON pt.postId = p.Id 
     GROUP BY t.tagName, year(creationDate) 
    ) pt 
WHERE seqnum = 1; 

統計では、最も一般的な要素はモードと呼ばれています。上記は、毎年1つのモードを返します。もし結びつきがあれば、任意のものが選択されます。

結束があるときにすべてのモードを使用する場合は、row_number()の代わりにrank()またはdense_rank()を使用します。

英語では、「apparition」は「ゴースト」を意味するため、クエリはちょっと面白いです。だから、列名をcntに変更しました。

+0

あなたの答えとあなたの説明に感謝します。 – Mattasse

関連する問題