【问题标题】:Average of Subgroup by GROUP BY in SQL ServerSQL Server 中按 GROUP BY 的子组平均值
【发布时间】:2020-04-10 15:21:40
【问题描述】:

我正在处理交通数据。我有以下数据表。我想在 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)]   

【问题讨论】:

  • 编辑您的问题并显示您想要的结果。设置某种 db fiddle 也会有所帮助。
  • 你试过窗口函数吗? SUM(speed) OVER(PARTITION BY Veh) as AvgSpeed
  • 我没有尝试过窗口函数。我已经编辑了问题以显示我期望的结果。
  • "SUM(speed) OVER(PARTITION BY Veh) as AvgSpeed" 它没有提供所需的输出..您有任何其他建议

标签: sql sql-server vb.net


【解决方案1】:

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

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

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多