簡體   English   中英

Room DB - DISTINCT 用於組合 2 個字段 (GPS)

[英]Room DB - DISTINCT for combination of 2 fields (GPS)

如何從 RoomDB 獲取獨特的 GPS 位置?

我的實體有GPS經緯度

@Entity
public class Location {

@PrimaryKey(autoGenerate = true)
public int id;

@ColumnInfo(name = "GPS_lat")
double GPSlat;

@ColumnInfo(name = "GPS_lon")
double GPSlon;

我的 dao 查詢

 // Read all
@Query("SELECT * FROM location")
List<Location> getLocations();enter code here

// Read only unique combination of GPS location 
 ?

我在玩 DISTINCT 或 group by,但仍然不知道如何將它們同時應用於 2 dB 列,謝謝

DISTINCT應用於整個提取的行,因此您將僅限於提取 2 列(這可能沒什么用)。

GROUP BY將是您想要的,您只需使用

  • @Query("SELECT * FROM location GROUP BY GPS_lat,GPS_lon")

  • 請注意,對於已有效壓縮為一行的所有行的值不同的列,其他列的內容應被視為不明確 但是,諸如sumcount之類的聚合函數會考慮列值。

    • 請注意, DISTINCT也可以在聚合函數中使用

考慮本機 SQL 中的這個例子:-

DROP TABLE IF EXISTS locations;
CREATE TABLE IF NOT EXISTS locations (name TEXT, GPS_long INTEGER, GPS_lat INTEGER);
INSERT INTO locations VALUES ('place1',1,1),('place2',2,1),('place3',1,1),('place4',2,1),('place5',3,3),('place6',3,3),('place7',1,1),('place8',2,1);
SELECT DISTINCT * FROM locations;
SELECT DISTINCT GPS_long,GPS_lat FROM locations;
SELECT 
    *, 
    group_concat(name) AS all_places, -- aggregate function
    count(*) AS same_location -- aggregate function
FROM locations 
GROUP BY GPS_long,GPS_lat;
DROP TABLE IF EXISTS locations;

這個

  • DROPS 表(用於測試)。
  • 創建表
  • 插入行(3 組位置 3 行在位置 1,1,2 行在位置 2,1 和 2 在位置 3,3)
  • 使用 DISTINCT 選擇所有列(它們都是不同的)
  • 使用 DISTINCT 僅選擇 GPS_long 和 GPS_lat 列(產生 3 行)
  • 使用 GROUP BY GPS_long,GPS_lat 使用聚合函數選擇所有列和一些附加列(結果為 3 行,但聚合數據)
  • DROPS 表(測試后清理)

結果是:-

第一個查詢(所有列上的 DISTINCT)

在此處輸入圖像描述

第二個查詢(GPS_long 和 GPS_lat 列上的 DISTINCT,即僅提取那些列)

在此處輸入圖像描述

第三個查詢(所有列 + 使用 GROUP BY GPS_long、GPS_lat) 在此處輸入圖像描述

  • 請注意group_concat function 如何獲取同一位置的所有地點的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM