4

在一张桌子上,我每天有几个措施

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

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

4

6 回答 6

3

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

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 日期,无法分辨哪个是最新的。

于 2013-03-15T14:42:13.207 回答
2

从 MySQL 8 开始,最佳方法将涉及使用FIRST_VALUE()LAST_VALUE()窗口函数

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)

更多详细信息,请参阅手册:

于 2018-09-19T19:24:04.173 回答
1

由于日期字符串是按字典顺序排序的,只需将两列加在一起,如下所示:

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

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

于 2014-01-15T15:08:54.050 回答
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

看看这个。

于 2013-03-15T14:35:15.947 回答
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 添加到表中,以便您可以对其进行排序,或者您可以将日期更改为日期时间字段,以便您可以按日期时间进行排序。

于 2013-03-15T14:35:41.660 回答
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,'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')

于 2014-03-18T08:27:35.947 回答