如果列值是冗余的,则仅按时间戳显示最新的

wbrvyc0a  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(277)

我有一张这样的table:

timesent            |nr | value 
2018-10-31 05:23:06 | 4 | Value 3
2018-10-31 05:20:19 | 4 | Value 2
2018-10-31 05:19:35 | 4 | Value 1
2018-10-31 04:55:56 | 3 | Value 2
2018-10-31 03:05:15 | 3 | Value 1
2018-10-31 01:31:49 | 2 | Value 1
2018-10-30 04:11:16 | 1 | Value 1

目前,我的选择如下:

SELECT * FROM values WHERE ORDER BY timesent DESC

我想做一个sqlselect语句,它只返回每个“nr”的最新值。
我的技能不足以将其转换为sql语句。我不知道´我甚至不知道我应该用谷歌搜索什么。

czq61nw1

czq61nw11#

Values 是mysql中的保留关键字。考虑将表名更改为其他名称;否则,您将不得不在其周围使用反勾号
有多种方法可以解决你的问题。一种方法是在 nr (要获取最大值的字段) timesent 仅限值行)。

SELECT v1.* 
FROM `values` AS v1 
LEFT JOIN `values` AS v2 
  ON v1.nr = v2.nr AND 
     v1.timesent < v2.timesent 
WHERE v2.nr IS NULL

对于mysql版本>=8.0.2,可以使用窗口函数。我们将决定 Row_Number() 对于分区上的每一行 nr ,与 timesent 按降序排列(最高 timesent 值的行号为1)。然后,在派生表中使用这个结果集,只考虑那些行,其中行号等于1。

SELECT dt.timesent,  
       dt.nr, 
       dt.value 
FROM 
(
  SELECT v.timesent, v.nr, v.value, 
         ROW_NUMBER() OVER (PARTITION BY v.nr 
                            ORDER BY v.timesent DESC) AS row_num  
  FROM `values` AS v 
) AS dt 
WHERE dt.row_num = 1

然而,另一种方法是获得 timesent 为了一个 nr 在派生表中分组。现在将此结果集连接到主表,以便只显示与max value对应的行:

SELECT v.timesent,  
       v.nr, 
       v.value 
FROM 
`values` AS v 
JOIN 
(
  SELECT nr, MAX(timesent) AS max_timesent
  FROM `values` 
  GROUP BY nr 
) AS dt ON dt.nr = v.nr AND 
           dt.max_timesent = v.timesent

相关问题