查询以SQL数据库在一天的不同间隔中减去相同的列值

时间:2019-05-27 08:32:24

标签: mysql sql

在MySQL中,我想基于另一列“时间戳”在不同的时间间隔中减去一列值。

table structure is : 
id | generator_id | timestamp             | generated_value
1  |  1           | 2019-05-27 06:55:20   | 123456     
2  |  1           | 2019-05-27 07:55:20   | 234566       
3  |  1           | 2019-05-27 08:55:20   | 333456       
..
..    
20  |  1           | 2019-05-27 19:55:20   | 9876908       

我要从上表中获取generate_value列值,该值应该是day的第一个时间戳与day的最后一个时间戳的差。

在上面的示例中,我正在查找查询,该查询应该给我输出为9,753,452(9876908-123456)。

一般来说,要在以下查询中使用日期的第一个值和最后一个值来获取单个记录

// Below will give me end day value
SELECT * FROM generator_meters where generator_id=1 and timestamp like '2019-05-27%' order by timestamp desc limit 1 ;

//this will give me last day value 
SELECT * FROM generator_meters where generator_id=1 and timestamp like '2019-05-27%' order by timestamp  limit 1 ;

问题是如何从日的最后一个值减去日的第一个值来获得最终的generated_value。

Expected Output 
 generator_id | generated_value
  1           | 9753452     

谢谢!

2 个答案:

答案 0 :(得分:1)

以下脚本将返回过滤后的ID和日期的预期结果-

SELECT generator_id,CAST(timestamp AS DATE) ,
(
    SELECT generated_value 
    FROM sun_electric.generator_meters B 
    WHERE timestamp = max(timestamp)
)
-
(
    SELECT generated_value 
    FROM sun_electric.generator_meters B 
    WHERE timestamp = min(timestamp)
) AS Diff
FROM sun_electric.generator_meters 
WHERE generator_id = 1
AND CAST(timestamp AS DATE) = '2019-05-27'
GROUP BY generator_id,CAST(timestamp AS DATE) ; 

如果您希望使用GROUP BY ID和Date获得相同的结果,只需删除以下过滤器即可

SELECT generator_id,CAST(timestamp AS DATE) ,
(
    SELECT generated_value 
    FROM sun_electric.generator_meters B 
    WHERE timestamp = max(timestamp)
)
-
(
    SELECT generated_value 
    FROM sun_electric.generator_meters B 
    WHERE timestamp = min(timestamp)
) AS Diff
FROM sun_electric.generator_meters 
GROUP BY generator_id,CAST(timestamp AS DATE) ;     

答案 1 :(得分:1)

在您的示例中,值变得越来越大。如果可以保证的话,您可以使用

select max(generated_value) - min(generated_value) as result
from sun_electric.generator_meters
where generator_id = 1
and date(timestamp) = date '2019-05-27';

或针对多个ID:

select generator_id, max(generated_value) - min(generated_value) as result
from sun_electric.generator_meters
and date(timestamp) = date '2019-05-27'
group by generator_id
order by generator_id;

如果该值未递增,则可以对ID 1使用以下查询:

select last_row.generated_value - first_row.generated_value as result
from 
(
  select * 
  from sun_electric.generator_meters
  where generator_id = 1
  and date(timestamp) = date '2019-05-27'
  order by timestamp
  limit 1
) first_row
cross join
(
  select * 
  from sun_electric.generator_meters
  where generator_id = 1
  and date(timestamp) = date '2019-05-27'
  order by timestamp desc
  limit 1
) last_row;

这里是获取多个ID的结果的一种方法:

select
  minmax.generator_id,
  (
    select generated_value 
    from sun_electric.generator_meters gm
    where gm.generator_id = minmax.generator_id
    and gm.timestamp = minmax.max_ts
  ) -
  (
    select generated_value 
    from sun_electric.generator_meters gm
    where gm.generator_id = minmax.generator_id
    and gm.timestamp = minmax.min_ts
  ) as result
from
(
  select generator_id, min(timestamp) as min_ts, max(timestamp) as max_ts
  from sun_electric.generator_meters
  where date(timestamp) = date '2019-05-27'
  group by generator_id
) minmax
order by minmax.generator_id;

如果您更喜欢,也可以将子查询移至from子句并加入它们。另一种方法是使用MySQL 8中提供的窗口函数。