根据 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
我们需要做几件事才能获得您想要的数据
- 我们需要将日期列转换为仅显示日期而不显示时间
- 然后我们需要按 ID 和日期对数据进行分组,并具有不同计数的串联 lat/long 列
- 然后我们可以使用带有 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)
我有一个 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
我们需要做几件事才能获得您想要的数据
- 我们需要将日期列转换为仅显示日期而不显示时间
- 然后我们需要按 ID 和日期对数据进行分组,并具有不同计数的串联 lat/long 列
- 然后我们可以使用带有 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)