根据 table 中的多列筛选 SQL 中的数据

Filter data in SQL based on multiple column in a table

我有一个 table geo_loc,其中包含每个送货员的地理位置(纬度和经度)以及其他列中的时间戳。

GEO_LOC Table 任意一天查看:-

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 Table 每天和多次投递都有类似上面的条目 agent_id.

对于任何一天,我想过滤所有 代理人的所有记录,这些代理人在任何一天都有一个以上的 gps 条目(geo_lat 和 geo_long)。

例如:
0908 在 13-02-2021 有相同的 geo_lat 和 geo_long,所以我不想要这一行。
但是 1134 有多个 geo_lat 和 geo_long在 13-02-2021 上输入,所以我想要这一天该代理的所有行。
2678 在 13-02-2021 上有一个条目,所以我也不知道这一行是什么。

期望的输出:-

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

我们需要做几件事才能获得您想要的数据

  1. 我们需要将日期列转换为仅显示日期而不显示时间
  2. 然后我们需要按 ID 和日期对数据进行分组,并具有不同计数的串联 lat/long 列
  3. 然后我们可以使用带有 WHERE IN 子句的 agent_id 从原始 table select

对于 1,我们可以使用 CONVERT 将 ISO8601 日期时间更改为 NVARCHAR 日期:

convert(nvarchar,date,103)

对于2,我们使用上面的以及COUNT DISTINCT和CONCAT; CONCAT 创建一个包含纬度和经度的列:

concat(geo_lat, ',', geo_long)

然后 COUNT DISTINCT 仅 return 个独特的 lat/long 组合:

concat(geo_lat, ',', geo_long)

然后我们可以将它们与 agent_id 上的 GROUP BY 子句和新的日期列放在一起,为您提供经过过滤的 table

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)