每天的第一个值和最后一个值之间的差异

时间:2013-03-15 14:28:14

标签: mysql sql

在表格中,我每天都有几项措施

29011   2012-12-28 09:00:00
28701   2012-12-28 10:00:00
28830   2012-12-28 11:00:00
28353   2012-12-28 12:00:00
28642   2012-12-28 13:00:00
28583   2012-12-28 14:00:00
28800   2012-12-29 09:00:00
28751   2012-12-29 10:00:00
28670   2012-12-29 11:00:00
28621   2012-12-29 12:00:00
28599   2012-12-29 13:00:00
28278   2012-12-29 14:00:00

如何获得每天最后一个值之间的差异

我想得到这样的结果:

428 2012-12-28
522 2012-12-29

我试过这个

SELECT (MAX(volume) - MIN(volume)),DATE_FORMAT(FROM_UNIXTIME(tstamp), '%Y-%m-%d') date FROM tank
GROUP BY DATE_FORMAT(FROM_UNIXTIME(tstamp), '%Y-%m-%d')
ORDER BY tstamp

但它没有采取第一个和最后一个措施,而是最小和最大。

6 个答案:

答案 0 :(得分:3)

使用subselect获取当天的最小和最大时间戳,然后将结果与原始表连接两次,一次为min,一次为max以获取卷。然后计算: -

SELECT Sub1.JustDate, (b.volume - a.volume) AS VolumeDifference
FROM (
SELECT DATE_FORMAT(FROM_UNIXTIME(tstamp), '%Y-%m-%d') AS JustDate, MIN(tstamp) AS MinTimeStamp, MAX(tstamp) AS MaxTimeStamp
FROM tank
GROUP BY JustDate) Sub1
INNER JOIN tank a ON Sub1.MinTimeStamp = a.tstamp
INNER JOIN tank b ON Sub1.MaxTimeStamp = b.tstamp

这假设它们是真正的unix时间戳,而不仅仅是一个CCYYMMDD日期,无法分辨哪个是最新的。

答案 1 :(得分:1)

由于日期字符串按字典顺序排序,只需将两列添加到一起,如:

"2012-12-28 09:00:00_29011"

在子选择中,在此生成的列上调用min()和max()。 然后你可以将_number部分分开来得到你的第一个和最后一个数字。

答案 2 :(得分:1)

从MySQL 8开始,最佳方法将涉及使用FIRST_VALUE() and LAST_VALUE() window functions

SELECT DISTINCT
  first_value(volume) OVER w - last_value(volume) OVER w AS diff,
  CAST(tstamp AS DATE) AS date
FROM tank
WINDOW w AS (
  PARTITION BY CAST(tstamp AS DATE) 
  ORDER BY tstamp
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
ORDER BY CAST(tstamp AS DATE)

有关更多详细信息,请参见手册:

答案 3 :(得分:0)

我试过这个postgres,它正在工作

select (maxvalue1-minalue1) as date, time from(
select min(id) as minalue1, max(id) as maxvalue1, time::Date from master_booking group by time::date
) data

检查出来。

答案 4 :(得分:0)

在这种情况下,First和Last是相对值,因为没有任何内容可以说明这些值中的哪一个:

29011   2012-12-28
28701   2012-12-28
28830   2012-12-28
28353   2012-12-28
28642   2012-12-28
28583   2012-12-28

是第一个或最后一个。您可以向表中添加auto_increment ID,以便对其进行排序,或者可以将日期更改为datetime字段,以便对日期时间进行排序。

答案 5 :(得分:0)

试试这个:

  

SELECT(max(volume)keep(dense_rank last order by to_char(tstamp,' YYYY-MM-DD')) - min(volume)keep(dense_rank last order by to_char(tstamp,&#) 39; YYYY-MM-DD')))差异,to_char(tstamp,' YYYY-MM-DD')日期从坦克   GROUP BY to_char(tstamp,' YYYY-MM-DD')   ORDER BY to_char(tstamp,' YYYY-MM-DD')