简体   繁体   English

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

[英]Query to subtract same column value at different interval of day with SQL database

In MySQL, I want to subtract one of column value at different interval of time based on another column 'timestamp'. 在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       

From above table I want to fetch the generated_value column value which should be difference of first timestamp fo day and timestamp of last value of day. 从上表中,我想获取generate_value列的值,该值应该是第一个时间戳记与日期的最后一个时间戳记之差。

In above example I am looking query which should give me output as 9,753,452 (9876908 - 123456). 在上面的示例中,我正在查找查询,该查询应该给我输出为9,753,452(9876908-123456)。

In general to fetch the single record of first value and last value of day I use below query 通常要获取一天的第一个值和最后一个值的单个记录,我在下面的查询中使用

// 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 ;

Question is how should I get the final generated_value by doing minus of first value of day from last value of day. 问题是如何通过从天的最后一个值减去天的第一个值来获得最终的generate_value。

Expected Output 
 generator_id | generated_value
  1           | 9753452     

Thanks in advance !! 提前致谢 !!

This following script will return your expected results for the filtered ID and Date- 以下脚本将返回过滤后的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) ; 

If you want the same result with GROUP BY ID and Date just remove the filter as below- 如果您希望使用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) ;     

In your example the value gets bigger and bigger. 在您的示例中,价值变得越来越大。 If this is guaranteed to be so, you can use 如果可以保证的话,您可以使用

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';

Or for multiple IDs: 或多个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;

If the value is not ascending, then you can use the following query for ID 1: 如果该值未递增,则可以对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;

Here is one way to get a result for multiple IDs: 这是获取多个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;

You can also move the subqueries to the from clause and join them, if you like this better. 如果您更喜欢,也可以将子查询移至from子句并加入它们。 Yet another approach would be to use window functions, available as of MySQL 8. 还有一种方法是使用窗口功能,该功能从MySQL 8开始可用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM