我正在处理堆栈溢出数据库,我希望每年都有最受欢迎的标记。我想要的输出是:
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 :(得分: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
的原因。