每个日期加载前5个记录

时间:2014-11-21 11:29:27

标签: mysql sql

我有一张桌子,其中有不同用户的日期明智测验得分。我想为每个日期加载前5名得分手。

表格样本创建语句

CREATE TABLE `subscriber_score` (
  `msisdn` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
  `date` date NOT NULL,
  `score` int(11) NOT NULL DEFAULT '0',

  `total_questions_sent` int(11) NOT NULL DEFAULT '0',

  `total_correct_answers` int(11) NOT NULL DEFAULT '0',
  `total_wrong_answers` int(11) NOT NULL DEFAULT '0',

  PRIMARY KEY (`msisdn`,`date`),
  KEY `fk_subscriber_score_subscriber1` (`msisdn`),
  CONSTRAINT `fk_subscriber_score_subscriber1` FOREIGN KEY (`msisdn`) REFERENCES `subscriber` (`msisdn`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

查询我尝试了

SELECT subscriber.msisdn AS msisdn,subscriber.name AS name,subscriber.gender AS gender,tmp2.score AS score,tmp2.date AS winning_date 
FROM subscriber,
    (SELECT msisdn,tmp.date,tmp.score 
     FROM subscriber_score,
          (SELECT date,MAX(score) AS score 
           FROM subscriber_score 
           WHERE date > '2014-10-10' AND date < '2014-11-10' GROUP BY date) 
          tmp 
     WHERE subscriber_score.date=tmp.date AND subscriber_score.score=tmp.score) 
tmp2 
WHERE subscriber.msisdn=tmp2.msisdn ORDER BY winning_date

实际输出:只显示每个日期的一名得分手。

通缉输出需要每个日期的前5位(或10位)记录。

4 个答案:

答案 0 :(得分:2)

我认为您可以使用变量为每行分配行号,然后为每个日期过滤前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;

<强> Example on SQL Fiddle

答案 1 :(得分:0)

将此查询称为不完整但希望有所帮助

SELECT SCORE
FROM table
WHERE date='somedate'
ORDER BY SCORE DESC LIMIT 5

答案 2 :(得分:0)

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     ;

这是您在oracle sql中解决问题的方法。

答案 3 :(得分:0)

尝试以下

     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