sqlite 带值更新的区分序列号

yqkkidmi  于 2023-06-06  发布在  SQLite
关注(0)|答案(2)|浏览(370)

你好,感谢接受我的问题,我有以下数据收集传感器和我需要得到只有最新的变化从所有数据,我使用sqlite与sqliteStuidio,请帮助我的查询,我可以使用得到预期的数据。先谢谢你。请查看图片,因为表格格式不正确。
data image
输入数据:
| 串行|钥匙|时间戳|价值|
| - -----|- -----|- -----|- -----|
| 0|十二岁|20230531010945| 1|
| 0|十一|20230531010912| 0|
| 0|十个|20230531010657| 1|
| 0|九个|20230531010648| 0|
| 1|八|20230531010551| 1|
| 1|七个|20230531010539| 0|
| 1|六|20230531010521| 0|
| 0| 5个|20230531010346| 0|
| 0| 4| 20230531000935| 1|
| 0| 3| 20230531000928| 0|
| 1| 2| 20230531000724| 1|
| 0| 1| 20230531000652| 1|
预期数据:
| 串行|钥匙|时间戳|价值|
| - -----|- -----|- -----|- -----|
| 0|十二岁|20230531010945| 1|
| 1|八|20230531010551| 1|
到目前为止我已经尝试了一些组合但失败了。。

SELECT sensor_data.[sensor_serial], sensor_data.[key],sensor_data.[time], sensor_data.[value]
FROM sensor_data
WHERE sensor_serial = (SELECT  sensor_serial FROM sensor_data)
ORDER BY time DESC

其输出为:

0   12  20230531010945  1
0   11  20230531010912  0
0   10  20230531010657  1
0   9   20230531010648  0
0   5   20230531010346  0
0   4   20230531000935  1
0   3   20230531000928  0
0   1   20230531000652  1
bq8i3lrv

bq8i3lrv1#

这可以通过以下方式完成:
首先,我们使用group bymax()确定每个sensor_serial的最大时间:

select sensor_serial, max(time) as max_time
from sensor_data
group by sensor_serial

然后将此数据集与表连接:

select sd.*
from sensor_data sd
inner join (
  select sensor_serial, max(time) as max_time
  from sensor_data
  group by sensor_serial
) as s on s.sensor_serial = sd.sensor_serial and s.max_time = sd.time

Demo here

zi8p0yeb

zi8p0yeb2#

请尝试:

SELECT *
FROM [sensor_data]
WHERE [time] IN
    (SELECT MAX([time])
    FROM [sensor_data]
    GROUP BY [sensor_serial]);

或者使用公共表表达式:

WITH CTE_Top (maxtime)
AS
    (SELECT MAX([time])
    FROM [sensor_data]
    GROUP BY [sensor_serial])
SELECT [sensor_serial], [key], [time], [value]
FROM [sensor_data]
INNER JOIN CTE_top ON [time] = [maxtime];

如果几个记录可能具有完全相同的时间戳,但密钥是唯一的,那么您可以尝试:

WITH CTE_Top (maxkey)
AS
    (SELECT MAX([key])
    FROM [sensor_data]
    GROUP BY [sensor_serial])
SELECT [sensor_serial], [key], [time], [value]
FROM [sensor_data]
INNER JOIN CTE_top ON [key] = [maxkey];
GO

相关问题