mysql-无法根据数据透视表中的最新日期和时间获取数据

时间:2016-06-13 09:33:37

标签: mysql pivot case

我有一个存储应用程序详细信息的表。应用程序只是一组显示分数的数据。

每个应用程序有6个部分,即1,2,3,4,5和6.因此,在数据库表中,部分的值可以是1到6。

相同的应用程序可以为部件保存一个或多个条目。例如,id为9的应用程序可以(可能是)第1部分的3个条目。对于每个部分,都有一个分数,分数只是一个数值。

我想要获取的是:为每个应用程序获取所有6个部分的分数,但只显示最近的分数。因此,如果申请9第1部分在01-06-2016得分为8,并且在03-06-2016得分为3,则应将3显示为得分。

我的表格如下:

var gulp = require('gulp');
var typescript = require('gulp-tsc');

gulp.task('default', function () {
// place code for your default task here
});

gulp.task('compile', function () {
gulp.src([
     'es6-shim/es6-shim.min.js',
     'systemjs/dist/system-polyfills.js',
     'systemjs/dist/system.src.js',
     'reflect-metadata/Reflect.js',
     'rxjs/**',
     'zone.js/dist/**',
     'core-js/**',
     '@angular/**'
], { cwd: "node_modules/**" }) /* Glob required here. */
 .pipe(gulp.dest('./wwwroot/node_modules'));

gulp.src('./scripts/systemjs.config.js') /* Glob required here. */
 .pipe(gulp.dest('./wwwroot/'));
gulp.src(['src/scripts/*.ts'])
    .pipe(typescript())
    .pipe(gulp.dest('./wwwroot/app/'));
gulp.src('./scripts/main.ts') /* Glob required here. */
 .pipe(typescript())
    .pipe(gulp.dest('./wwwroot/app/'));
});

这是我为此目的编写的查询:

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;

但它没有提取正确的数据。我无法根据最新的done_date和done_time获取数据。我只是根据第一个条目得到它。

这是我创建此类数据透视表时所遵循的tutorial link

这是一个示例SQL FIDDLE

1 个答案:

答案 0 :(得分:1)

那么,您应首先通过application_Id和part获取最近日期时间的所有数据,这将用作内部联接

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;

顺便说一下,你只会得到所有部分的最新日期时间,但似乎它是你想要的?