Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 每个日期加载前5条记录_Mysql_Sql - Fatal编程技术网

Mysql 每个日期加载前5条记录

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名得分手

表示例create语句:

我尝试过的查询:

实际输出:每个日期只显示一个最佳得分者


想要输出前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;