4

现在我知道这已经被问过好几次了,但是我已经尝试将不同的现有解决方案应用于我的特定问题很长一段时间没有成功。所以我转过来希望得到一些指导。

我有一个名为 tblanswers 的表,其中包含链接到另一个表中不同问题的答案。我想要的是获取特定问题 ID 的每个答案的计数,但将其限制为每个月的 n 个第一个答案。

来自 tblanswers 的样本数据:

id  qid answer  timestamp
72  162 2       1366027324
71  161 4       1343599200
70  162 2       1366014201
69  161 4       1366011700
68  162 2       1366006729
67  161 3       1366010948
66  162 2       1365951084

这是我到目前为止的查询:

SELECT *, COUNT(*) c FROM(
    SELECT answer, timestamp, YEAR(FROM_UNIXTIME(timestamp)) yr, MONTH(FROM_UNIXTIME(timestamp)) mo FROM tblanswers
        WHERE qid = 161
            ORDER BY timestamp ASC
) q GROUP BY YEAR(FROM_UNIXTIME(timestamp)), MONTH(FROM_UNIXTIME(timestamp)), answer

那会给我这样的东西:(样本数据中的日期和数字不准确)

answer  yr      mo  c
1       2013    5   5
2       2013    5   3
3       2013    5   2
1       2013    6   5
2       2013    6   15
3       2013    6   7

假设我只想看一个月内的前三个答案,那么 count 永远不会超过 3。我该如何限制每个月?

最终数据应该是每个答案的总和,如下所示:

answer num_answers
1      2
2      3
3      3

我认为这些解决方案之一可以工作,但不是如何: http: //code.openark.org/blog/mysql/sql-selecting-top-n-records-per-group http://code.openark.org/博客/mysql/sql-selecting-top-n-records-per-group-another-solution

任何帮助表示赞赏。谢谢!

4

3 回答 3

0

这个解决方案怎么样:

SELECT qid, answer, YEAR(FROM_UNIXTIME(timestamp)) yr, MONTH(FROM_UNIXTIME(timestamp)) mo, COUNT(*) no
FROM tblanswers
WHERE qid = 161
GROUP BY answer, yr, mo
HAVING COUNT(*) <= 2
ORDER BY timestamp ASC;

和小提琴:http ://sqlfiddle.com/#!2/1541eb/126

于 2013-06-29T06:36:25.013 回答
0

此解决方案基于此处的 top-N-per-group 方法

SELECT answer, COUNT(*) num_answers
FROM (SELECT answer, yearmonth,
             @rn := CASE WHEN @prevmonth = yearmonth
                         THEN @rn + 1
                         ELSE 1
                    END rn,
             @prevmonth := yearmonth
      FROM (SELECT @rn := NULL, @prevmonth := NULL) init,
           (SELECT answer,
                   YEAR(FROM_UNIXTIME(timestamp))*100+MONTH(FROM_UNIXTIME(timestamp)) yearmonth
            FROM tblanswers
            WHERE qid = 220
            ORDER BY timestamp) x) y

WHERE rn <= 3
GROUP BY answer

SQLFIDDLE

于 2013-06-29T00:54:20.350 回答
-2

没有理由重新发明轮子并冒着遇到错误、次优代码的风险。您的问题是常见的每组限制问题的微不足道的扩展(另请参见 tag )。已经有经过测试和优化的解决方案来解决这个问题

于 2013-06-28T22:45:43.250 回答