0

我正在开发一个用于室内定位的 android 应用程序,我已经将 wifi 指纹存储在包含以下列的表tbl_rssi中:

  1. _id(每个指纹的 id - 这也是 tbl_reference_points._id 的 FK)
  2. MAC(可以在每个指纹中读取的接入点的 MAC 地址)
  3. 信号(每个接入点的信号)

我还有另一个表tbl_reference_points包含:

  1. _id(20 个参考点中的每一个的 PK)。
  2. floorNum(建筑物内)
  3. buildingNum(建筑物数量)

在处理我的数据库之前:

  • 我声明 WifiManager 并使用 startScan() 读取每个预定参考点中的接入点及其信号。

  • 我将扫描结果存储在List<ScanResult>.

假设我为 tbl_rssi 中的 20 个参考点 () 中的每一个存储了 10 个 mac 地址。要确定用户的位置(即他所在的 20 个参考点之一),我需要执行以下步骤:

  1. 检索与我从 ScanResults 列表中获得的具有相同 mac 地址的记录。在这里,我想应该创建一个动态查询。
  2. 对于所有 20 个参考点,找到预存信号与我们在上一步中的每条记录的列表中读取的信号之间的差异。
  3. 分别计算每个差异的平方。
  4. 对于 20 个参考点中的每一个,应计算(差的平方)的总和。
  5. 找到最小的数字,这是所需的参考点。

我相信我需要创建一个动态 SQL 查询,我可以在第一步中做到这一点。但是我需要帮助来完成后续步骤中的计算,因为我是 SQL 查询的新手。提前致谢

4

1 回答 1

0

为了能够在 SQL 中进行计算,您需要将扫描结果保存在数据库中。像这样创建一个表:

CREATE TEMPORARY TABLE ScanResults(MAC, signal);

并填充它。

ScanResults对于一个特定的参考点,您可以通过连接和表来计算每个 MAC 的信号强度差异tbl_rssi

SELECT tbl_rssi.MAC,
       tbl_rssi.signal - ScanResults.signal
FROM tbl_rssi JOIN ScanResults ON tbl_rssi.MAC = ScanResults.MAC
WHERE tbl_rssi._id = ?

计算平方和只需使用聚合函数即可:

SELECT SUM((tbl_rssi.signal - ScanResults.signal) * 
           (tbl_rssi.signal - ScanResults.signal))
FROM tbl_rssi JOIN ScanResults ON tbl_rssi.MAC = ScanResults.MAC
WHERE tbl_rssi._id = ?

要计算每个参考点而不是一个特定参考点的总和,请使用GROUP BY

SELECT tbl_rssi._id,
       SUM((tbl_rssi.signal - ScanResults.signal) * 
           (tbl_rssi.signal - ScanResults.signal))
FROM tbl_rssi JOIN ScanResults ON tbl_rssi.MAC = ScanResults.MAC
GROUP BY tbl_rssi._id

要获取具有最小值的参考点,请按计算值列对结果进行排序,然后只取第一条记录:

SELECT tbl_rssi._id,
       SUM((tbl_rssi.signal - ScanResults.signal) * 
           (tbl_rssi.signal - ScanResults.signal))
FROM tbl_rssi JOIN ScanResults ON tbl_rssi.MAC = ScanResults.MAC
GROUP BY tbl_rssi._id
ORDER BY 2
LIMIT 1
于 2013-07-28T08:50:43.003 回答