SQLite 查询以选择匹配的行和 2 个具有最高 ID 的下一个

受虐狂

我的表有 4 列:

这是我的数据库。

ID      SSID      BSSID         RSSI
1.      jbhd      ed:2d:5c      -60 
2.      ABCD      ab:cd:17      -68
3.      ijkl      cs:gb:d6      -75 
4.      vxfs      dc:5g:f4      -72
5.      cxzv      fg:4d:ac      -54
6.      ABCD      ab:cd:17      -68
7.      ertd      bv:we:12      -57
8.      erbc      gd:56:lt      -83

....
518.    ABCD      ab:cd:17      -68
519.    asfd      ag:4g:32      -60
520.    aasd      gd:5g:56      -79

我正在尝试编写一个函数,该函数查询数据库以返回特定记录和 2 个具有最高ID.

到目前为止我所做的是:

public Cursor get3records(String mac, int level){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery("SELECT * from Scans_table st where ID >= ( select ID from Scans_table where BSSID =? AND RSSI =? ) order by st.ID asc limit 3 ", new String[] {mac, String.valueOf(level)});
    return res;
}

maclevel是决定我想从查询中获取哪些记录的参数。

例如,查看提供的示例数据。我想有所有的记录ab:cd:17BSSID列,并-68RSSI列(记录2,6,518),和2下一个记录最高的ID(记录3,4,7,8,519,520)。

问题是,这个函数返回这样的结果:

ID      SSID      BSSID         RSSI
2.      ABCD      ab:cd:17      -68
3.      ijkl      cs:gb:d6      -75 
4.      vxfs      dc:5g:f4      -72

而我正在寻找的结果应该是这样的:

ID      SSID      BSSID         RSSI
2.      ABCD      ab:cd:17      -68
3.      ijkl      cs:gb:d6      -75 
4.      vxfs      dc:5g:f4      -72
6.      ABCD      ab:cd:17      -68
7.      ertd      bv:we:12      -57
8.      erbc      gd:56:lt      -83
518.    ABCD      ab:cd:17      -68
519.    asfd      ag:4g:32      -60
520.    aasd      gd:5g:56      -79
戈登·利诺夫

如果ids 是连续的,没有间隙(如您的示例中所示),您可以执行以下操作:

select st.*
from scans_table st join
     (select st2.id
      from scans_table st2
      where bssid = ? and rssi = ?
     ) ids
     on st.id in (ids.id, ids.id + 1, ids.id + 2);

如果 id 不是连续的,这会变得更加棘手。最简单的方法可能是实现一个lag()

select *
from (select st.*,
             (select st2.bssid
              from scans_table st2
              where st2.id < st.id
              order by st2.id desc
              limit 1
             ) as prev_bssid,
             (select st2.rssi
              from scans_table st2
              where st2.id < st.id
              order by st2.id desc
              limit 1
             ) as prev_rssi,
             (select st2.bssid
              from scans_table st2
              where st2.id < st.id
              order by st2.id desc
              limit 1, 1
             ) as prev2_bssid,
             (select st2.rssi
              from scans_table st2
              where st2.id < st.id
              order by st2.id desc
              limit 1, 1
             ) as prev2_rssi
      from scans_table st
     ) st
where (bssid = ? and rssi = ?) or
      (prev_bssid = ? and prev_rssi = ?) or
      (prev2_bssid = ? and prev2_rssi = ?);

当然,如果您使用的是最新版本的 SQLite,您可以使用窗口函数,这会更容易:

select *
from (select st.*,
             lag(bssid) over (order by id) as prev_bssid,
             lag(rssi) over (order by id) as prev_rssid,
             lag(bssid, 2) over (order by id) as prev2_bssid,
             lag(rssi, 2) over (order by id) as prev2_rssid
      from scans_table st
     ) st
where (bssid = ? and rssi = ?) or
      (prev_bssid = ? and prev_rssi = ?) or
      (prev2_bssid = ? and prev2_rssi = ?);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MySQL:如何选择具有下一个更大ID的行?

如何创建具有下一个 ID 号的行

选择下一个没有参考ID的mysql行

根据视图获取下一个和上一个MySQL ID

SQLite:从一个表中选择所有具有与不同表中 ID 匹配的 ID 的行

如何在每次锚定点击时选择具有唯一ID的下一个元素?

获取下一个和上一个CakePHP 2的Paginator的URL

在 wordpress foreach 循环中,返回当前行 id 和下一个/上一个行 id

SQL 选择随机排序,但某些行必须按“下一个”id 列分组

SQLite Entity Framework查询以返回下一个可用日期

SQLite查询以获取包含名字或姓氏的搜索文本的下一个可用字符

SQLite查询带有两个表以查找“下一个要观看的剧集”

MySQL SELECT输出同一行中每个ID的下一个日期

有没有办法在 2 行中找到一个下一个的相似词

Sqlite 查询以获取匹配搜索关键字后的下一个可用字符列表

给定一个数字,找到下一个更大的数字,该数字具有唯一数字,但0和2

选择下一个元素

选择下一个状态

让Postgres选择下一个最小可用ID

如何将表行 ID 传递给下一个视图?

如何在下一个示例中获取行 ID

使用Entity Framework获取特定ID的下一个和上一个实体?

按父级,上一个和下一个ID排序菜单节点

单击具有上一个和下一个的表行

如何获取“上一个ID的排名”中排名下一个的行?

在 mysql 中根据 id 到下一个或上一个值计算行的 over() 子句错误

下一个和上一个按钮将在OWL轮播上滑动2个项目

在 vuejs 中使用 2 个按钮(下一个和上一个按钮)处理限制数据

单击下一个和上一个后,如何使此滑块显示2个引号