【问题标题】:TSQL - Group by latitude and longitude and average speedTSQL - 按经纬度和平均速度分组
【发布时间】:2017-06-13 07:22:06
【问题描述】:

我有这个 SQL 查询

SELECT 
    [machine], 
    [speed], 
    Round([latitude], 3)  AS Latitude, 
    Round([longitude], 3) AS Longitude 
FROM
    [position] WITH (nolock) 
WHERE  
    (attime BETWEEN '20170606 8:00' AND '20170606 20:00' ) 
    AND machine IN (SELECT DISTINCT [machine] 
                    FROM [haul] WITH (nolock) 
                    WHERE ([timestart] BETWEEN '20170606 8:00' AND '20170606 20:00') 
                      AND machine IN (72)) 
    AND [speed] > 0

它返回的数据集如下:

ID    SPEED   LAT     LON
-----------------------------
72 - 3,6  - 14,368 - 26,898
72 - 14,4 - 14,368 - 26,898
72 - 28,8 - 14,368 - 26,898
72 - 32,4 - 14,368 - 26,897

但我还需要获取平均速度和坐标才能查看以下记录:

ID    SPEED   LAT     LON
---------------------------
72 - 15,6 - 14,368 - 26,898   
72 - 32,4 - 14,368 - 26,897

当我尝试这个查询时:

SELECT 
    [machine], 
    Avg([speed]) AS Speed, 
    Avg(Round([latitude], 3)) AS Latitude, 
    Avg(Round([longitude], 3)) AS Longitude 
FROM   
    [wdata_position] WITH (nolock) 
WHERE
    (attime BETWEEN '20170606 8:00' AND '20170606 20:00') 
    AND machine IN (SELECT DISTINCT [machine] 
                    FROM [wdata_haul] WITH (nolock) 
                    WHERE ([timestart] BETWEEN '20170606 8:00' AND '20170606 20:00') 
                      AND machine IN (72)) 
    AND [speed] > 0 
GROUP BY 
    [machine], [speed], latitude,  longitude 

它将行数从 3,926 减少到 3,883,我看到了这个数据集:

72  3,59999990463257    14,357  26,898
72  3,59999990463257    14,359  26,901
72  3,59999990463257    14,359  26,901
72  3,59999990463257    14,366  26,899
72  3,59999990463257    14,368  26,899
72  3,59999990463257    14,368  26,898
72  3,59999990463257    14,368  26,898
72  3,59999990463257    14,368  26,898
72  3,59999990463257    14,368  26,9

这根本不是我需要的。

如何更改我的 SQL 以实现我的目标?

谢谢!

【问题讨论】:

  • 我在该查询中没有看到任何 GROUP BYAVG 关键字。你尝试过什么吗?你遇到问题了吗? NOLOCK是怎么回事,你真的要读取脏数据吗? NOLOCK 表示您的查询将读取可能回滚的脏数据,而不是它不会占用任何锁
  • 当 `Machine 只能是 72 时,AND Machine IN (SELECT ...) 有什么意义?
  • @PanagiotisKanavos 我已经为 SPEED LAT 和 LON 尝试了AVG,但它并没有根据我的需要减少行数。
  • @PanagiotisKanavos 忽略它AND Machine IN (SELECT ...)
  • 试过如何?你写了什么? AVG 计算一组行的平均值。是 GROUP BY 设置的组

标签: sql-server tsql group-by average


【解决方案1】:

我不确定我是否理解您正在查看的数据(例如,当纬度/经度坐标保持不变时,机器 72 的速度如何变化?),但我想我明白您在尝试什么无论如何都要做。

听起来您想获得机器、纬度和经度的每个独特组合的“速度”平均值?

如果是这样,那么您只需修改查询以按这些列分组,以便仅聚合速度(使用平均值):

SELECT [machine], 
       Avg([speed])          AS Speed, 
       Round([latitude], 3)  AS Latitude, 
       Round([longitude], 3) AS Longitude 
FROM   [wdata_position] WITH (nolock) 
WHERE  ( attime BETWEEN '20170606 8:00' AND '20170606 20:00' ) 
       AND machine IN (SELECT DISTINCT [machine] 
                       FROM   [wdata_haul] WITH (nolock) 
                       WHERE  ( [timestart] BETWEEN '20170606 8:00' AND 
                                                    '20170606 20:00' ) 
                              AND machine IN ( 72 )) 
       AND [speed] > 0 
GROUP  BY 
       [machine], 
       Round([latitude], 3), 
       Round([longitude], 3)

【讨论】:

  • 您可以完全删除子查询,因为它返回 72 或不返回任何内容
  • @PanagiotisKanavos 我不知道该子查询背后的逻辑,但这可能是有效的。这与问题无关。
  • 你好兄弟!感谢您的输入!正如您在我的问题中看到的那样,如果有相同的坐标,我需要 AVG 速度。我的意思是如果 LAT:12.333 和 LON:14.555 有 3 行,我只需要显示 1 行而不是 3 行,并且还需要显示 AVG 速度。你介意修改你的答案吗?是否可以仅使用 1 个查询来归档它,或者在这种情况下逻辑本身更复杂?
  • @DmitryBoyko 不是 Natthan 的查询已经做了吗?给定问题中的数据,每个坐标只返回一行
  • 上面的查询应该这样做,除非我错过了有关您的数据的某些内容。如果您只希望每纬度/经度有一行,那么您必须从结果中删除 [machine] 并分组,因为包括这意味着您将获得每台机器/纬度/经度的一行。
猜你喜欢
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多