松果时序数据库为每个数据表提供一个快照视图,快照视图包含该表中每个设备最新的一条数据。若某个设备未添加过数据,则不会出现在快照视图中;快照视图名为表名后加".snapshot",例如:表tab01的快照视图为tab01.snapshot快照视图使用实例:

    • 查询快照中满足某些条件的设备
    1. SELECT *
    2. FROM testSnap.snapshot
    3. WHERE devid in (1, 3, 5) AND val01 = true
    • 以5分钟作为设备离线的标准,即,某设备5分钟之内未上传新数据则认为该设备已离线:

    在松果时序数据库中,每次查询最多获取10000条数据,以查询离线设备为例:若要查询的设备超过10000条,则需要多次查询,如果简单使用LIMIT子句查询,两次查询之间可能有一些数据插入会导致某些数据无法查询到。

    1. --1.创建设备
    2. INSERT INTO sys_dev(tabname, devid, devname)
    3. VALUES('testSnap', 101, 'device 101'),
    4. ('testSnap', 102, 'device 102'),
    5. ('testSnap', 103, 'device 103'),
    6. ('testSnap', 104, 'device 104'),
    7. ('testSnap', 105, 'device 105'),
    8. ('testSnap', 106, 'device 106')
    9.  
    10. --2.插入数据,以5分钟离线为例,所有设备都已离线
    11. INSERT INTO testSnap(devid, tstamp, val01, val02)
    12. (102, now(-10m), true, 2001),
    13. (103, now(-10m), true, 3001),
    14. (104, now(-10m), true, 4001),
    15. (105, now(-10m), true, 5001),
    16. (106, now(-10m), true, 6001)
    17.  
    18. --3.查询离线数据,每次查询两条
    19. --3.1第一次查询
    20. SELECT * FROM testSnap.snapshot
    21. WHERE tstamp < now(-5m)
    22. LIMIT 0,2
    23. --查询到设备 101,102
    24.  
    25. --3.2第二次查询
    26. SELECT * FROM testSnap.snapshot
    27. WHERE tstamp < now(-5m)
    28. --查询到设备 103,104
    29.  
    30. --3.3第三次查询
    31. SELECT * FROM testSnap.snapshot
    32. WHERE tstamp < now(-5m)
    33. LIMIT 4,2
    34. --查询到设备 105,106

    设备103未被查询到,故:直接使用LIMIT子句多次查询可能会少查询到数据,正确的方式应该如下:

    1. --1. 第一次查询
    2. SELECT * FROM testSnap.snapshot
    3. WHERE tstamp < now(-5m)
    4. LIMIT 2
    5. --查询到设备 101,102
    6.  
    7. --2. 后面的查询
    8. SELECT * FROM testSnap.snapshot
    9. WHERE tstamp < now(-5m) AND devid > 102