获取每个组的前n个结果

23 浏览
0 Comments

获取每个组的前n个结果

我正在使用SQL从表中按日期分组检索最后20行。我想要限制每个post_day组中只选择前10行的投票数DESC。\n

SELECT *, DATE(timestamp) as post_day 
FROM stories 
ORDER BY post_day DESC, votes DESC
LIMIT 0, 20

\n表格如下所示:\n

STORYID         TIMESTAMP           VOTES
1               2015-03-10          1
2               2015-03-10          2
3               2015-03-9           5
4               2015-03-9           3

0
0 Comments

问题的原因是MySQL中没有ROW_NUMBER()函数来对每个组内的记录进行排序,并选择前n条记录。解决方法是使用MySQL中的用户自定义变量来模拟ROW_NUMBER()函数。

在上述代码中,首先使用子查询来初始化两个用户自定义变量。然后,在外部查询中,使用ROW_NUMBER()函数的模拟实现,即使用用户自定义变量来生成行号。最后,通过添加条件`x.row_number <= 10`来筛选出每个组内的前n条记录。

为了更好地理解该解决方法,可以参考在SQL中如何选择每个组的第一行/最小行/最大行这篇文章。

总结起来,解决这个问题的关键是使用MySQL的用户自定义变量来模拟ROW_NUMBER()函数,以便对每个组内的记录进行排序,并选择前n条记录。

0
0 Comments

在这个问题中,我们需要从表stories中获取每个日期的前n个结果。这个问题的原因是我们需要根据日期来分组,并且只获取每个组中的前n个结果。解决这个问题的方法是使用子查询和窗口函数来为每个结果添加行号,然后在外部查询中筛选出行号小于等于n的结果。

下面是解决这个问题的查询:

select theDate, votes
from 
(
   select storyid, theDate, votes,
       @rownum := if(@date = theDate, @rownum + 1, 1) as rownum,
       @date := theDate as not_used
  from stories
  cross join (select @rownum := 0, @date := '') as r
  order by theDate, votes desc
) A
where A.rownum <= 10;

这个查询首先在子查询中对结果进行排序,并使用变量@rownum和@date来为每个结果添加行号和日期。然后在外部查询中,我们只选择行号小于等于10的结果,即每个日期的前10个结果。

运行这个查询后,我们可以得到如下结果:

+------------+-------+
| theDate    | votes |
+------------+-------+
| 2015-03-09 |    79 |
| 2015-03-09 |    75 |
| 2015-03-09 |    75 |
| 2015-03-09 |    63 |
| 2015-03-09 |    51 |
| 2015-03-09 |    51 |
| 2015-03-09 |    21 |
| 2015-03-09 |    11 |
| 2015-03-09 |     7 |
| 2015-03-09 |     5 |
| 2015-03-10 |    51 |
| 2015-03-10 |    51 |
| 2015-03-10 |    44 |
| 2015-03-10 |    32 |
| 2015-03-10 |    26 |
| 2015-03-10 |    26 |
| 2015-03-10 |    19 |
| 2015-03-10 |    12 |
| 2015-03-10 |    12 |
| 2015-03-10 |    11 |
+------------+-------+

这样,我们成功地获取了每个日期的前10个结果。

0