【问题标题】:Google Maps SQL Server : calculating outlier geographic data within groupGoogle Maps SQL Server:计算组内的异常地理数据
【发布时间】:2021-09-30 16:48:43
【问题描述】:

有 100 家供应商,每家供应商提供 50 到 1000 件商品。每个供应商都可能在其办公室附近或遍布整个国家或大洲拥有物品。

由于 LatLng 是人工输入的,因此会发生一些错误。由于数据量大且不断“流失”,因此很难识别错误。

为了提高数据质量,我想识别每个供应商的异常值,以便修复它们。如果供应商的商品大部分都在纽约附近,那么加利福尼亚的商品将是一个异常值。

供应商

SupplierID int
Latitude DECIMAL(12,9)
Longitude DECIMAL(12,9)

物品

ItemID int
SupplierID int
LatLng geography

我认为我需要为此使用标准差,但将其放入 T-SQL 让我很头疼。

我想根据每个供应商的具体偏差输出每个供应商的异常值列表。

此代码输出项目以及每个项目与供应商办公室之间的距离。

WITH cte AS 
(
    SELECT 
        ItemID,
        SupplierID,
        LatLng,
        LatLng.STDistance(GEOGRAPHY::Point(a.Latitude, a.Longitude, 4326))/1000 As Distance
    FROM 
        Items v
    JOIN 
        Suppliers a ON v.SupplierID = a.SupplierID
)
SELECT 
    ItemID, SupplierID, Distance 
FROM cte

这是标准偏差的 SQL 功能(来自博客文章):

DECLARE @StdDev DECIMAL(5,2) 
DECLARE @Avg DECIMAL(5,2)

SELECT 
   @StdDev = STDEV(Qty), 
   @Avg = AVG(Qty) 
FROM Sales

SELECT 
   * 
FROM 
   Sales 
WHERE 
   Qty > @Avg - @StdDev AND
   Qty < @Avg + @StdDev

我需要做的步骤

  1. 计算STDEVAVG 的距离,GROUP BY SupplierID
  2. 输出项目的供应商距离大于AVG + STDEV的项目

这是我挠头的地方,因为这是我已经执行的多个步骤之后的多个步骤。我想我可以将我拥有的内容插入 TEMP 表并从那里开始,但这真的是最好的方法吗?

【问题讨论】:

    标签: sql-server standard-deviation


    【解决方案1】:

    您可以为此使用窗口函数。 AVGSTDEV 都可以作为窗口函数使用

    WITH Distances AS 
    (
        SELECT 
            i.ItemID,
            s.SupplierID,
            i.LatLng,
            v.SupplierLocation,
            i.LatLng.STDistance(v.SupplierLocation)/1000 As Distance
        FROM 
            Items i
        JOIN 
            Suppliers s ON i.SupplierID = s.SupplierID
        CROSS APPLY (VALUES (
            GEOGRAPHY::Point(s.Latitude, s.Longitude, 4326)
        )) v(SupplierLocation)
    ),
    Averages AS (
        SELECT
            ItemID,
            SupplierID,
            LatLng,
            SupplierLocation
            Distance,
            AVG(Distance)   OVER (PARTITION BY SupplierID) AS Avg,
            STDEV(Distance) OVER (PARTITION BY SupplierID) AS StDev
        FROM
            Distances
    )
    SELECT 
        ItemID,
        SupplierID,
        Distance,
        Avg,
        StDev
    FROM
        Averages
    WHERE 
        Distance > Avg - StdDev AND
        Distance < Avg + StdDev;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-06
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2012-01-25
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多