2016-06-13 48 views
0

我有一個存儲應用程序詳細信息的表。應用程序只不過是一組顯示分數的數據。mysql-無法從數據透視表獲取基於最新日期和時間的數據

每個應用程序有6份即1,2,3,4,5,和6。因此,在數據庫表中的部件可以具有值範圍從1到6

相同的應用程序可具有一個或多個爲一部分保存的條目。例如,ID爲9的應用程序可以有(可能)3部分的第1部分和每個部分有一個分數和分數只是一個數值。

我想要獲取的是:獲取每個應用程序的所有6個部分的分數,但只顯示最近的分數。因此,如果應用程序9第1部分在2016年6月1日的得分爲8,並且在2016年3月3日的得分爲3,則應該顯示3作爲得分。

我的表看起來像這樣:

CREATE TABLE IF NOT EXISTS `reg_updates` (
    `id` int(11) NOT NULL, 
    `application_id` int(11) NOT NULL, 
    `part` int(11) NOT NULL, 
    `reg_score_id` int(11) NOT NULL, 
    `reg_score` int(11) NOT NULL, 
    `done_date` date NOT NULL, 
    `done_time` time NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1; 

這是我爲了這個目的書面查詢:

SELECT MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date,RU.application_id, 
MAX(CASE WHEN (RU.part = 1) THEN RU.reg_score END) part1Score, 
MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score, 
MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score, 
MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score, 
MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score, 
MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score 
FROM reg_updates AS RU 
GROUP BY RU.application_id; 

但它不獲取正確的數據。我無法根據最新的done_date和done_time獲取數據。我只是基於第一個條目纔得到它。

這是tutorial link我跟着創建了這個有點數據透視表。

以下是樣本SQL FIDDLE

回答

1

那麼,你應該先通過APPLICATION_ID和部分與最近的日期時間的所有數據,這些數據將被用作內部連接

SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,RU.part 
FROM reg_updates 
GROUP BY application_id, part; 

然後用它在查詢

SELECT 
    -- I'm not sure you want that line, do you ? It will only retrieve the latest date_time of ALL your parts for that application 
    MAX(CONCAT(RU.done_date,' ',RU.done_time)) AS date, 
    RU.application_id, 
    MAX(CASE WHEN (RU.part = 1) THEN RU.reg_score END) part1Score, 
    MAX(CASE WHEN RU.part = 2 THEN RU.reg_score END) part2Score, 
    MAX(CASE WHEN RU.part = 3 THEN RU.reg_score END) part3Score, 
    MAX(CASE WHEN RU.part = 4 THEN RU.reg_score END) part4Score, 
    MAX(CASE WHEN RU.part = 5 THEN RU.reg_score END) part5Score, 
    MAX(CASE WHEN RU.part = 6 THEN RU.reg_score END) part6Score 
FROM reg_updates AS RU 
--now you join on the previous 
join (SELECT MAX(CONCAT(done_date,' ',done_time)) AS maxDate ,application_id,part 
    FROM reg_updates 
    GROUP BY application_id, part) maxValues 
     on maxValues.part = RU.part and 
      maxValues.application_Id = RU.application_id and 
      maxValues.maxDate = CONCAT(RU.done_date,' ',RU.done_time) 

GROUP BY RU.application_id; 

通過方式,你只會得到所有部分的最新日期時間,但它似乎是你想要的?

+0

讓我試試這個。 –

相關問題