如何从 table 获取小时内的第一行和最后一行
How to get first and last row in hour from table
我正在尝试创建一个图表来显示一天内每小时的耗电量。
我的设备每 15 分钟向我的服务器发送一次数据,之前的 power_kwh 总是等于或大于 sensor_id 内的 power_kwh 的当前值。在某些情况下,一栋建筑物可能有两个或更多功率计,因此我需要考虑将具有相同 periods.So 的值组合在一起 我想每小时检索两行,其中第一个值和最后一个值包含 sensor_id 值
所以我有 table
具有值:日期,power_kwh,sensor_id
mytable
在互联网上搜索了一段时间后,我发现查询很好,但 sensor_id
有问题
SELECT
DATE,
power_kwh,
sensor_id
FROM
sensor_data
WHERE
(HOUR(DATE), MINUTE(DATE)) IN(
SELECT
HOUR(DATE),
MIN(MINUTE(DATE))
FROM
sensor_data
GROUP BY
HOUR(DATE)
)
UNION
SELECT
DATE,
power_kwh,
sensor_id
FROM
sensor_data
WHERE
(HOUR(DATE), MINUTE(DATE)) IN(
SELECT
HOUR(DATE),
MAX(MINUTE(DATE))
FROM
sensor_data
GROUP BY
HOUR(DATE)
);
My current result
+----------------------------+-----------+-----------+
| date | power_kwh | sensor_id |
+----------------------------+-----------+-----------+
| 2020-03-12 15:40:03.000000 | 682685.56 | 4 |
| 2020-03-12 15:59:03.000000 | 682688.44 | 5 |
| 2020-03-12 16:00:03.000000 | 682688.56 | 5 |
| 2020-03-12 16:59:06.000000 | 682697.44 | 5 |
| 2020-03-12 17:00:06.000000 | 682697.56 | 5 |
| 2020-03-12 17:59:08.000000 | 682706.44 | 5 |
| 2020-03-12 18:00:08.000000 | 682706.56 | 5 |
| 2020-03-12 18:59:11.000000 | 682715.44 | 5 |
| 2020-03-12 19:00:11.000000 | 682715.56 | 5 |
| 2020-03-12 19:59:13.000000 | 682724.44 | 5 |
| 2020-03-12 20:00:13.000000 | 682724.56 | 5 |
| 2020-03-12 20:59:16.000000 | 682733.44 | 5 |
My expected result
+----------------------------+-----------+-----------+
| date | power_kwh | sensor_id |
+----------------------------+-----------+-----------+
| 2020-03-12 15:40:03.000000 | 153566.34 | 4 |
| 2020-03-12 15:59:03.000000 | 153575.44 | 4 |
| 2020-03-12 15:00:02.000000 | 682688.56 | 5 |
| 2020-03-12 15:58:06.000000 | 682697.44 | 5 |
| 2020-03-12 16:00:06.000000 | 153576.23 | 4 |
| 2020-03-12 16:59:08.000000 | 153585.44 | 4 |
| 2020-03-12 16:02:08.000000 | 682706.56 | 5 |
| 2020-03-12 16:59:11.000000 | 682715.44 | 5 |
我的 sql 版本是
mysql Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)
还有一件事,我在考虑速度和其他问题,所以如果没有解决方案,你能给我建议在 Java Spring 中处理它吗
让我知道你们是否需要更多信息。
谢谢!!!
如果你是运行MySQL8.0,可以使用window功能:
select date, power_kwh, sensor_id
from (
select
s.*,
row_number() over(partition by s.sensor_id, date(s.date), hour(s.date) order by s.date) rn_asc,
row_number() over(partition by s.sensor_id, date(s.date), hour(s.date) order by s.date desc) rn_desc
from sensor_data s
) t
where rn_asc = 1 or rn_desc = 1
在早期版本中,您可以使用聚合查询进行连接:
select s.date, s.power_kwh, s.sensor_id
from sensor_data s
inner join (
select sensor_id, min(date) min_date, max(date) max_date
from sensor_data
group by sensor_id, date(date), hour(date)
) g
on g.sensor_id = s.sensor_id
and s.date in (g.min_date, g.max_date)
我正在尝试创建一个图表来显示一天内每小时的耗电量。 我的设备每 15 分钟向我的服务器发送一次数据,之前的 power_kwh 总是等于或大于 sensor_id 内的 power_kwh 的当前值。在某些情况下,一栋建筑物可能有两个或更多功率计,因此我需要考虑将具有相同 periods.So 的值组合在一起 我想每小时检索两行,其中第一个值和最后一个值包含 sensor_id 值 所以我有 table 具有值:日期,power_kwh,sensor_id mytable
在互联网上搜索了一段时间后,我发现查询很好,但 sensor_id
有问题SELECT
DATE,
power_kwh,
sensor_id
FROM
sensor_data
WHERE
(HOUR(DATE), MINUTE(DATE)) IN(
SELECT
HOUR(DATE),
MIN(MINUTE(DATE))
FROM
sensor_data
GROUP BY
HOUR(DATE)
)
UNION
SELECT
DATE,
power_kwh,
sensor_id
FROM
sensor_data
WHERE
(HOUR(DATE), MINUTE(DATE)) IN(
SELECT
HOUR(DATE),
MAX(MINUTE(DATE))
FROM
sensor_data
GROUP BY
HOUR(DATE)
);
My current result
+----------------------------+-----------+-----------+
| date | power_kwh | sensor_id |
+----------------------------+-----------+-----------+
| 2020-03-12 15:40:03.000000 | 682685.56 | 4 |
| 2020-03-12 15:59:03.000000 | 682688.44 | 5 |
| 2020-03-12 16:00:03.000000 | 682688.56 | 5 |
| 2020-03-12 16:59:06.000000 | 682697.44 | 5 |
| 2020-03-12 17:00:06.000000 | 682697.56 | 5 |
| 2020-03-12 17:59:08.000000 | 682706.44 | 5 |
| 2020-03-12 18:00:08.000000 | 682706.56 | 5 |
| 2020-03-12 18:59:11.000000 | 682715.44 | 5 |
| 2020-03-12 19:00:11.000000 | 682715.56 | 5 |
| 2020-03-12 19:59:13.000000 | 682724.44 | 5 |
| 2020-03-12 20:00:13.000000 | 682724.56 | 5 |
| 2020-03-12 20:59:16.000000 | 682733.44 | 5 |
My expected result
+----------------------------+-----------+-----------+
| date | power_kwh | sensor_id |
+----------------------------+-----------+-----------+
| 2020-03-12 15:40:03.000000 | 153566.34 | 4 |
| 2020-03-12 15:59:03.000000 | 153575.44 | 4 |
| 2020-03-12 15:00:02.000000 | 682688.56 | 5 |
| 2020-03-12 15:58:06.000000 | 682697.44 | 5 |
| 2020-03-12 16:00:06.000000 | 153576.23 | 4 |
| 2020-03-12 16:59:08.000000 | 153585.44 | 4 |
| 2020-03-12 16:02:08.000000 | 682706.56 | 5 |
| 2020-03-12 16:59:11.000000 | 682715.44 | 5 |
我的 sql 版本是
mysql Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)
还有一件事,我在考虑速度和其他问题,所以如果没有解决方案,你能给我建议在 Java Spring 中处理它吗 让我知道你们是否需要更多信息。 谢谢!!!
如果你是运行MySQL8.0,可以使用window功能:
select date, power_kwh, sensor_id
from (
select
s.*,
row_number() over(partition by s.sensor_id, date(s.date), hour(s.date) order by s.date) rn_asc,
row_number() over(partition by s.sensor_id, date(s.date), hour(s.date) order by s.date desc) rn_desc
from sensor_data s
) t
where rn_asc = 1 or rn_desc = 1
在早期版本中,您可以使用聚合查询进行连接:
select s.date, s.power_kwh, s.sensor_id
from sensor_data s
inner join (
select sensor_id, min(date) min_date, max(date) max_date
from sensor_data
group by sensor_id, date(date), hour(date)
) g
on g.sensor_id = s.sensor_id
and s.date in (g.min_date, g.max_date)