2014-11-21 52 views
0

我有一張表,其中有不同用戶的明智測驗分數。我想每個日期都加載前5名得分手。每個日期載入前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)記錄。

+0

什麼5?編輯您的問題並提供樣本輸出和所需結果。 – 2014-11-21 11:32:49

回答

0

參照此查詢其沒有完成,但希望它有助於

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

這給出了只有一個日期的記錄。我需要選定日期範圍內每個日期的5條記錄。 – 2014-11-21 11:48:15

+0

驗證您是否有特定日期的5條記錄。 – 2014-11-21 11:49:47

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你的問題的解決方案。

+0

最新問題,親愛的 – 2014-11-21 11:51:31

+0

,但他的問題也標記爲sql – 2014-11-21 11:52:51

+0

,否則他必須在他的問題中聲明他在mysql中查找結果 – 2014-11-21 11:56:11

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 
+0

他正在使用MySQL,在MySQL中沒有OVER/PARTITION – amenadiel 2014-11-21 12:00:48

+2

@nitubansal即使我寫了相同的查詢密集的排名......我認爲他應該提及,他正在尋找mysql的結果也是他的問題標記爲SQL和它可能是任何sql – 2014-11-21 12:06:07

+1

無處不在,寫入的查詢應該在sql或MySQL中,並且在方法中沒有任何錯誤,並且可能對查找sql​​方法的人有用。 – 2014-11-21 12:07:23

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

+0

這是在MySQL中做到這一點的正確方式,但它可能需要一些微調,例如初始化@d和開始日期。 – amenadiel 2014-11-21 11:59:56

+0

謝謝,這看起來像。讓我適應我的情況,稍後再告訴你。 – 2014-11-21 12:48:41

相關問題