【发布时间】: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
我需要做的步骤
- 计算
STDEV和AVG的距离,GROUP BY SupplierID - 输出项目的供应商距离大于
AVG + STDEV的项目
这是我挠头的地方,因为这是我已经执行的多个步骤之后的多个步骤。我想我可以将我拥有的内容插入 TEMP 表并从那里开始,但这真的是最好的方法吗?
【问题讨论】:
标签: sql-server standard-deviation