在表格中,我每天都有几项措施
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
但它没有采取第一个和最后一个措施,而是最小和最大。
答案 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')