我有一個表 geo_loc ,其中包含每個送貨員的地理位置(緯度和經度)以及其他列中的時間戳。
任何一天的 GEO_LOC 表視圖:-
agent_id date geo_lat geo_long
1134 13-02-2021T09:09:54 17.66 89.44
1134 13-02-2021T10:10:47 19.99 76.56
1134 13-02-2021T10:50:47 19.99 76.56
1134 13-02-2021T11:57:47 19.99 33.33
1134 13-02-2021T13:13:23 34.44 89.67
2678 13-02-2021T10:25:11 45.55 34.67
4657 13-02-2021T11:55:33 22.34 66.78
4657 13-02-2021T12:20:27 22.34 66.78
4657 13-02-2021T15:15:13 33.45 45.67
7545 13-02-2021T08:17:55 12.45 56.56
7545 13-02-2021T11:55:23 18.56 87.77
0908 13-02-2021T16:55:56 19.99 79.99
0908 13-02-2021T17:43:12 19.99 79.99
0908 13-02-2021T18:12:34 19.99 79.99
GEO_LOC 表具有上述每天和多個交付代理 ID 的條目。
對于任何一天,我都想過濾所有那些在任何一天擁有多個 gps 條目(geo_lat 和 geo_long)的代理的所有記錄。
例如:
0908 在 2021 年 2 月 13 日具有相同的 geo_lat 和 geo_long,所以我不想要這一行。
但是 1134 在 2021 年 2 月 13 日有多個 geo_lat 和 geo_long 條目,所以我想要這一天的所有行。
2678 在 2021 年 2 月 13 日有一個條目,所以我也不知道這一行是什么。
期望的輸出:-
agent_id date geo_lat geo_long
1134 13-02-2021T09:09:54 17.66 89.44
1134 13-02-2021T10:10:47 19.99 76.56
1134 13-02-2021T10:50:47 19.99 76.56
1134 13-02-2021T11:57:47 19.99 33.33
1134 13-02-2021T13:13:23 34.44 89.67
4657 13-02-2021T11:55:33 22.34 66.78
4657 13-02-2021T12:20:27 22.34 66.78
4657 13-02-2021T15:15:13 33.45 45.67
7545 13-02-2021T08:17:55 12.45 56.56
7545 13-02-2021T11:55:23 18.56 87.77
uj5u.com熱心網友回復:
我們需要做幾件事來獲取您想要的資料
- 我們需要將 Date 列轉換為僅顯示日期而不顯示時間
- 然后,我們需要按 ID 和 Date 對資料進行分組,并使用連接的 lat/long 列的不同計數
- 然后我們可以使用帶有 WHERE IN 子句的 agent_id 從原始表中進行選擇
對于 1,我們可以使用 CONVERT 將 ISO8601 日期時間更改為 NVARCHAR 日期:
convert(nvarchar,date,103)
對于 2,我們使用上述以及 COUNT DISTINCT 和 CONCAT;CONCAT 創建一個包含 lat 和 long 的單列:
concat(geo_lat, ',', geo_long)
然后 COUNT DISTINCT 只回傳唯一的緯度/經度組合:
concat(geo_lat, ',', geo_long)
然后,我們可以將它們與 agent_id 上的 GROUP BY 子句和新的日期列放在一起,為您提供一個過濾表
select
agent_id
, convert(nvarchar,date,103)
, count(distinct(concat(geo_lat, ',', geo_long)))
from [71405703]
GROUP BY agent_id, convert(nvarchar,date,103)
agent_id date count
908 13/02/2021 1
1134 13/02/2021 4
2678 13/02/2021 1
4657 13/02/2021 2
7545 13/02/2021 2
然后我將該查詢放入 CTE,以便我可以輕松地針對列撰寫 WHERE 子句。
最終腳本如下所示:
WITH TableFilter (agent, date, count)
AS
(
select
agent_id
, convert(nvarchar,date,103)
, count(distinct(concat(geo_lat, ',', geo_long)))
from [71405703]
GROUP BY agent_id, convert(nvarchar,date,103))
SELECT * FROM [71405703]
WHERE agent_id IN (select agent FROM TableFilter WHERE count > 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442201.html
