Mysql 每个日期加载前5条记录
我有一个表格,里面有不同用户的日期测验分数。我想为每个日期加载前5名得分手 表示例create语句: 我尝试过的查询: 实际输出:每个日期只显示一个最佳得分者Mysql 每个日期加载前5条记录,mysql,sql,Mysql,Sql,我有一个表格,里面有不同用户的日期测验分数。我想为每个日期加载前5名得分手 表示例create语句: 我尝试过的查询: 实际输出:每个日期只显示一个最佳得分者 想要输出前5名,或者说每个日期需要10条记录。请参考此查询,它不完整,但希望能有所帮助 SELECT SCORE FROM table WHERE date='somedate' ORDER BY SCORE DESC LIMIT 5 这就是如何在oracle sql中找到问题的解决方案。请尝试下面的方法 SELECT sub
想要输出前5名,或者说每个日期需要10条记录。请参考此查询,它不完整,但希望能有所帮助
SELECT SCORE
FROM table
WHERE date='somedate'
ORDER BY SCORE DESC LIMIT 5
这就是如何在oracle sql中找到问题的解决方案。请尝试下面的方法
SELECT subscriber.msisdn AS msisdn,subscriber.name AS name,subscriber.gender AS gender,tmp2.score AS score,tmp2.date AS winning_date
FROM subscriber inner join
(select msisdn,date, score, ROW_NUMBER() OVER(PARTITION BY date ORDER BY score DESC) AS Row
FROM subscriber_score
WHERE date > '2014-10-10' AND date < '2014-11-10' GROUP BY date)
tmp
on subscriber.msisdn=tmp.msisdn and tmp.row<=5
我认为您可以使用变量为每行分配一个行号,然后为每个日期筛选前5名
SELECT s.name AS name,
s.gender AS gender,
s.msisdn,
ss.date,
ss.score
FROM ( SELECT ss.msisdn,
ss.score,
@r:= CASE WHEN ss.Date = @d THEN @r + 1 ELSE 1 END AS RowNum,
@d:= ss.date AS winning_date
FROM subscriber_score AS ss
CROSS JOIN (SELECT @d:= '', @r:= 0) AS v
WHERE ss.date > '2014-10-10'
AND ss.date < '2014-11-10'
ORDER BY ss.Date, ss.Score DESC
) AS ss
INNER JOIN Subscriber AS s
ON s.msisdn = ss.msisdn
WHERE ss.RowNum <= 5;
5个什么?编辑您的问题并提供示例输出和所需结果。这只提供一个日期的记录。我需要为所选日期范围内的每个日期提供5条记录。请验证您是否有该特定日期的5条记录。但他的问题也标记为SQL,否则他必须在问题中声明他在MySQL中查找结果。这就是为什么@amenadiel我在我的查询下面写道,如何在oracle SQL中执行此操作这是正确的方法在MySQL中执行,尽管它可能需要一些微调,比如用开始日期初始化@d。谢谢,这似乎是正确的。让我适应我的场景,稍后再告诉你。他使用的是MySQL,没有OVER/PARTITIONMySQL@nitubansal就连我也写了同样的高等级查询。。。我想他应该提到,他正在mysql中寻找结果,他的问题也用sql标记,可能是任何sqlnowhere编写的查询都应该是sql或mysql,这种方法没有任何错误,可能对寻找sql方法的人有用。
select bc.msisdn msisdn,bc.name name,bc.gender gender,ab.score score,ab.date winning_date
(
select msisdn,date,score,
dense_rank() over (partition by date order by score desc) rnk
from subscriber_score
) ab,subscriber bc
where bc.msisdn=ab.msisdn and ab.rnk<=5
order by winning_date ;
SELECT subscriber.msisdn AS msisdn,subscriber.name AS name,subscriber.gender AS gender,tmp2.score AS score,tmp2.date AS winning_date
FROM subscriber inner join
(select msisdn,date, score, ROW_NUMBER() OVER(PARTITION BY date ORDER BY score DESC) AS Row
FROM subscriber_score
WHERE date > '2014-10-10' AND date < '2014-11-10' GROUP BY date)
tmp
on subscriber.msisdn=tmp.msisdn and tmp.row<=5
SELECT s.name AS name,
s.gender AS gender,
s.msisdn,
ss.date,
ss.score
FROM ( SELECT ss.msisdn,
ss.score,
@r:= CASE WHEN ss.Date = @d THEN @r + 1 ELSE 1 END AS RowNum,
@d:= ss.date AS winning_date
FROM subscriber_score AS ss
CROSS JOIN (SELECT @d:= '', @r:= 0) AS v
WHERE ss.date > '2014-10-10'
AND ss.date < '2014-11-10'
ORDER BY ss.Date, ss.Score DESC
) AS ss
INNER JOIN Subscriber AS s
ON s.msisdn = ss.msisdn
WHERE ss.RowNum <= 5;