如何获得每年几个价值组之间的最大值

时间:2016-12-17 16:24:24

标签: sql sql-server group-by

我正在处理堆栈溢出数据库,我希望每年都有最受欢迎的标记。我想要的输出是:

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

但是此查询会返回每年的所有标记。我不知道怎么做。

1 个答案:

答案 0 :(得分: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;

在统计中,最常见的元素称为模式。以上每年只返回一种模式。如果有联系,则选择任意一个。

如果您想要有关系时的所有模式,请使用rank()dense_rank()代替row_number()

用英语,"幻影"意味着"鬼",所以查询有点搞笑。这就是我将列名更改为cnt的原因。