Средние данные SQL, основанные на расстоянии - PullRequest
1 голос
/ 06 апреля 2010

Я довольно новичок в SQL. У меня есть база данных с записями, основанными на дорогах / милях. Моя цель - получить среднее значение каждые 52,8 фута вдоль дороги. Моя связанная таблица содержит данные каждые 15 футов, эта таблица, конечно, имеет внешний ключ, связывающий ее с первичной таблицей.

Если бы я хотел вытащить среднее значение каждые 52,8 фута вдоль заданной милиной отметки, как бы я поступил?

Пример данных:

    RecID   Begin_MP    End_MP

    100  0  0.56

    RecID    MP Value1  Value2
    100      0  159      127.7
    100  0.003  95.3     115.3
    100  0.006  82.3       107
    100  0.009  56.5      74.5
    100  0.011  58.1      89.1
    100  0.014  95.2      78.8
    100  0.017  108.9    242.5
    100   0.02  71.8      73.3
    100  0.023  84.1      80.2
    100  0.026  65.5      66.1
    100  0.028  122      135.8
    100  0.031  99.9     230.7
    100  0.034  95.7     111.5
    100  0.037  127.3     74.3
    100   0.04  140.7    543.1

Первые данные являются примером дороги. Второе подмножество данных - это значения, которые мне нужно запрашивать каждые 52,8 фута.

Спасибо

1 Ответ

2 голосов
/ 06 апреля 2010

Вы можете сгруппировать данные в блоки по 52,8 фута. Один из способов сделать это - разделить расстояние на 52,8 и округлить до целого числа. Таким образом, 25 принадлежит группе 1, 100 принадлежит группе 2, 110 принадлежит группе 3 и т. Д.

В SQL Server вы могли бы написать так:

select 
    52.8 * cast(dist/52.8 as int) as Distance
,   avg(value1)
,   avg(value2)
from YourTable
group by cast(dist/52.8 as int)

Ниже приведен пример с вашими данными. Поскольку данные варьируются от 0 до 0,04, я сделал так, чтобы они вычисляли средние значения для блока 0,01 фута:

declare @Road table (RecID int, Begin_MP float, End_MP float)
insert into @Road select 100, 0, 0.56

declare @Values table (RecID int, MP float, Value1 float, Value2 float)
insert into @Values values
(100, 0    ,   159  ,   127.7),
(100, 0.003,   95.3 ,   115.3),
(100, 0.006,   82.3 ,   107),
(100, 0.009,   56.5 ,   74.5),
(100, 0.011,   58.1 ,   89.1),
(100, 0.014,   95.2 ,   78.8),
(100, 0.017,   108.9,   242.5),
(100, 0.02 ,   71.8 ,   73.3),
(100, 0.023,   84.1 ,   80.2),
(100, 0.026,   65.5 ,   66.1),
(100, 0.028,   122  ,   135.8),
(100, 0.031,   99.9 ,   230.7),
(100, 0.034,   95.7 ,   111.5),
(100, 0.037,   127.3,   74.3),
(100, 0.04 ,   140.7,   543.1);

select    
    r.RecID
,   cast(v.MP/0.01 as int)*0.01 as StartMP
,   AVG(v.Value1) as AvgVal1
,   AVG(v.Value2) as AvgVal2
from      @Road as r
left join @Values as v
on        r.RecID = v.RecID
group by  r.RecID, cast(v.MP/0.01 as int)

Это печатает:

RecID  StartMP AvgVal1  AvgVal2
100    0.00    98,275   106,125
100    0.01    87,4     136,8
100    0.02    85,85    88,85
100    0.03    107,63   138,83
100    0.04    140,7    543,1
...