2017-09-14 142 views
1

我有此表从我必须选择最新的行中每个位置一列选择最新的记录组

| location | parameter | datetime    | value | 
--------------------------------------------------------------------- 
| Location 1 | P1   | 2017-09-13 05:00:00  | 0.68 | 
| Location 1 | P2   | 2017-09-13 05:00:00  | 6  | 
| Location 1 | P3   | 2017-09-13 06:00:00  | 19 | 
| Location 1 | P4   | 2017-09-13 06:00:00  | 1  | 
| Location 2 | P1   | 2017-09-13 05:00:00  | 0.1 | 
| Location 2 | P2   | 2017-09-13 05:00:00  | 2  | 
| Location 2 | P3   | 2017-09-13 06:00:00  | 26 | 
| Location 2 | P5   | 2017-09-13 06:00:00  | 7.9 | 
| Location 2 | P4   | 2017-09-13 07:00:00  | 0  | 
| Location 3 | P1   | 2017-09-13 04:00:00  | 0.47 | 
| Location 3 | P2   | 2017-09-13 05:00:00  | 1  | 
| Location 3 | P3   | 2017-09-13 04:00:00  | 25 | 
| Location 3 | P5   | 2017-09-14 05:00:00  | 3.8 | 
--------------------------------------------------------------------- 

enter image description here

我曾尝试以下查询,但两者都没有返回每个位置的最新数据。

SELECT * FROM mytable WHERE 
datetime in (SELECT max(datetime) FROM myTable Group by location) 
group by location; 

SELECT * FROM myTable AS t1 
INNER JOIN 
(
    SELECT MAX(datetime) AS maxDate 
    FROM myTable 
    GROUP BY location 
) AS t2 ON t1.datetime = t2.maxDate group by t1.location; 

两个查询返回错误的数据位置2.

一旦做到这一点我也想在最新的日期相同,则查询添加另一个条件按值排序desc并选择最高值的记录。

预期的输出是

| location | parameter | datetime    | value | 
--------------------------------------------------------------------- 
| Location 1 | P3   | 2017-09-13 06:00:00  | 19 | 
| Location 2 | P4   | 2017-09-13 07:00:00  | 0  | 
| Location 3 | P5   | 2017-09-14 05:00:00  | 3.8 | 
--------------------------------------------------------------------- 

但查询我试图返回错误的日期,地点2.

任何帮助表示赞赏。

+1

你如何识别最新行如果两个行具有相同的'datetime'? –

+0

这并不重要,任何与每个位置的最新日期的行都会很好,但我想添加另一个条件,正如我在问题中提到的那样。 – Ana

+0

您是否也可以发布预期的结果集?还优选包括样本数据以及格式化文本而不是图像。 –

回答

1

可以使用变量此:

SELECT location, parameter, datetime, value 
FROM (
    SELECT location, parameter, datetime, value, 
      @seq := IF(@loc = location, @seq + 1, 
        IF(@loc := location, 1, 1)) AS seq 
    FROM mytable 
    CROSS JOIN (SELECT @seq := 0, @loc = '') AS vars 
    ORDER By location, datetime desc, value desc) AS t 
WHERE t.seq = 1 

内查询有一个ORDER BY条款,首先返回自己的片内的最新要求每组记录。对于第一个记录,变量@seq使用由IF函数实现的逻辑设置为1。外部查询只是简单地过滤派生表以获取每个location切片的预期记录。

Demo here

+0

这是完美的,谢谢:) – Ana

1

您需要首先得到每个位置的最新时间,例如:

SELECT location, MAX(`datetime`) 
FROM table 
GROUP BY location; 

,然后与同桌加入,例如:

SELECT t1.* 
FROM table t1 JOIN (
    SELECT location, MAX(`datetime`) 
    FROM table 
    GROUP BY location 
) a 
ON t1.location = a.location AND t1.datetime = a.datetime; 

您可以通过添加排序结果ORDER BY t1.value DESC或任何其他列。