地理位置或Lat&的尺寸在数据仓库中很长

时间:2017-07-25 21:25:31

标签: sql-server data-warehouse dimensional-modeling

我有一个DimPlace维度,其中包含该地点的名称(由用户手动输入)以及该地点的纬度和经度(自动捕获)。由于手动输入地点,同一个地方可能会多次出现不同的名称,此外,两个不同的地方可能彼此非常接近。

我们希望能够分析两个"之间的MPG"但我们希望将它们分组以形成更大的区域 - 即使用lat和amp;长期将一个位置的所有各种拼写,以及不同但非常接近的位置放在一个记录中。

我打算为此制作一个新的维度 - 类似于DimPlaceGeozone。我正在寻找一个资源,以帮助加载所有lat&长值映射到......某事?也许邮政编码或城市名称?有时你可以找到一个加载常见尺寸的脚本(比如DimTime) - 我会喜欢类似于lat和amp;北美的长期价值观?

1 个答案:

答案 0 :(得分:3)

我过去做过类似的事情......我前面遇到的一个绊脚石是,跨越边界的2个位置可能比两个位于同一区域的位置在物理上更接近。< / p>

我通过创建一个&#34;双网格&#34;来解决这个问题。导致每个位置落入4个区域的系统。这样,共有至少1&#34;区域的2个位置&#34;你知道他们在彼此的范围内。

这是一个例子,覆盖了大部分美国......

IF OBJECT_ID('tempdb..#LatLngAreas', 'U') IS NOT NULL 
DROP TABLE #LatLngAreas;
GO

WITH 
    cte_Lat AS (
        SELECT 
            t.n,
            BegLatRange = -37.9 + (t.n / 10.0),
            EndLatRange  = -37.7 + (t.n / 10.0)
        FROM
            dbo.tfn_Tally(1030, 0) t
        ),
    cte_Lng AS (
        SELECT 
            t.n,
            BegLngRange = -159.7 + (t.n / 10.0),
            EndLngRange = -159.5 + (t.n / 10.0)
        FROM
            dbo.tfn_Tally(3050, 0) t
        )
SELECT 
    Area_ID = ROW_NUMBER() OVER (ORDER BY lat.n, lng.n),
    lat.BegLatRange, 
    lat.EndLatRange, 
    lng.BegLngRange, 
    lng.EndLngRange
    INTO #LatLngAreas
FROM
    cte_Lat lat
    CROSS JOIN cte_Lng lng;


SELECT 
    b3.Branch_ID,
    b3.Name,
    b3.Lat,
    b3.Lng,
    lla.Area_ID
FROM
    dbo.ContactBranch b3    -- replace with DimPlace
    JOIN #LatLngAreas lla
        ON b3.Lat BETWEEN lla.BegLatRange AND lla.EndLatRange
        AND b3.lng BETWEEN lla.BegLngRange AND lla.EndLngRange;

HTH, 杰森