SQL Server中GROUP BY的子组平均值

问题描述 投票:0回答:1

我正在处理路况数据。我有以下数据表。我想在10米的位置上每秒钟获得所有车辆的平均速度。数据时间间隔为0.2秒。首先,我需要确定每秒的平均车辆速度。然后我需要确定沿该位置的10米间隔每秒的平均车辆速度。

Sim Time (sec) Veh No    Position (m)    Speed (km/hr)
0.20           1             0.01           0.00
0.40           1             2.74          34.56
0.60           1             5.46          23.45 
0.60           2             2.20          45.12
0.60           3             1.30          25.12
0.80           1             8.18          34.12
0.80           2             5.67          20.19
0.80           3             4.65          34.54
1.00           1            10.91          21.15 
1.00           2             9.14          19.28
1.00           3             8.00          25.12
1.20           1            13.63          34.12
1.20           2            12.61          28.45
1.20           3            11.35          34.12
1.20           4             0.87          32.11
1.40           1            16.35          21.18 
1.40           2            16.07          23.12
1.40           3            14.70          24.34
1.40           4             4.44          27.76
1.60           1            19.08          34.12
1.60           2            19.54          25.87 
1.60           3            18.05          20.12
1.60           4             8.00          34.11
1.60           5             1.65          21.11
1.80           1            21.80          29.34 
1.80           2            23.01          25.98 
1.80           3            21.40          22.31
1.80           4            11.57          33.98
1.80           5             4.37          21.87
2.00           1            24.52          29.34
2.00           2            26.48          26.01
2.00           3            24.75          22.98 
2.00           4            15.14          32.91
2.00           5             7.08          22.34
2.20           1            27.25          28.67  
2.20           2            29.95          25.89
2.20           3            28.10          23.01  
2.20           4            18.70          31.23
2.20           5             9.79          23.03
2.40           1            29.97          27.67  
2.40           2            33.42          26.56     
2.40           3            31.44          24.12
2.40           4            22.27          30.54
2.40           5            12.48          24.01
2.40           6             1.35          32.76
2.60           1            32.69          23.34
2.60           2            36.88          34.32
2.60           3            34.79          32.32
2.60           4            25.83          26.23
2.60           5            15.16          34.21
2.60           6             5.20          23.21
2.80           1            35.42          26.21
2.80           2            40.35          31.01
2.80           3            38.14          23.45
2.80           4            29.40          25.74
2.80           5            17.83          24.61
2.80           6             9.05          28.65
2.80           7             3.07          21.34
2.80           8             2.10          26.34
3.00           1            38.14          27.32

我已经尝试过这个。尽管它非常基础,但是却没有任何进展:

DECLARE @i DEC = 1.00
DECLARE @j DEC = 10.00
SELECT [Sim Time (sec)], [Position (m)], AVG([Speed (km/hr)]) as AvgSpeed from [Sim VehRecord] 
GROUP BY [Sim Time (sec)], [Position (m)] 
HAVING [Sim Time (sec)] > @i AND [Sim Time (sec)] < @i+1 AND [Position (m)] > @j AND [Position (m)] < @j+10

我希望结果应该如下:

Sim Time(sec) Position (m)    Avg Speed (km/hr)
1.00            10.00            29.05
1.00            20.00            21.15
2.00            10.00            26.55 
2.00            20.00            28.39
2.00            30.00            25.99
3.00            10.00            25.89
3.00            20.00            28.52 
3.00            30.00            26.82
3.00            40.00            27.21
3.00            50.00            31.01

我也尝试过这个。但是结果结束了零记录。

WITH Temp AS 
(   SELECT 3 as SimTime , 0 as Position
    UNION ALL
    SELECT SimTime+1, Position + 10
    FROM Temp
    WHERE Position < 10000
    )
SELECT [Sim Time (sec)], [Position (m)], AVG([Speed (km/hr)]) as AvgSpeed from [Sim VehRecord]
INNER JOIN Temp
ON [Sim VehRecord].[Sim Time (sec)] = Temp.SimTime   
WHERE [Sim Time (sec)] > Temp.SimTime AND [Sim Time (sec)] < Temp.SimTime + 1 
AND [Position (m)] > Temp.Position AND [Position (m)] < Temp.Position+10
GROUP BY [Sim Time (sec)], [Position (m)]   
sql sql-server vb.net
1个回答
0
投票

我有解决方案,是从另一个论坛收到的。它按预期工作。

SELECT ceiling([Sim Time (sec)]), ceiling([Position (m)]/10)*10, Avg([Speed (km/hr)]) AS AvgSpeed 
FROM [Sim VehRecord]
WHERE  [Position (m)] > 0
GROUP  BY ceiling([Sim Time (sec)]), ceiling([Position (m)]/10)*10
ORDER  BY ceiling([Sim Time (sec)]), ceiling([Position (m)]/10)*10

感谢所有人。

© www.soinside.com 2019 - 2024. All rights reserved.