Sql server TSQL-按纬度、经度和平均速度分组

Sql server TSQL-按纬度、经度和平均速度分组,sql-server,tsql,group-by,average,Sql Server,Tsql,Group By,Average,我得到了这个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 I

我得到了这个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 
它将行的数量从3926减少到3883,我看到了以下数据集:

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以实现目标


谢谢大家!

我不确定我是否理解您正在查看的数据,例如,当lat/long坐标保持不变时,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)

我没有在该查询中看到任何GROUPBY或AVG关键字。你试过什么吗?你遇到问题了吗?NOLOCK是怎么回事,你真的想读取脏数据吗?NOLOCK意味着您的查询将读取可能被回滚的脏数据,而不是它不会接受任何锁。选择中的点和机器是什么。。。当“机器只能是72”时@PanagiotisKanavos我已经尝试了速度LAT和LON的平均值,但它并没有减少我需要的行数。@PanagiotisKanavos只是忽略它,选择机器…如何尝试?你写了什么?AVG计算一组行的平均值。您可以完全删除子查询,因为它返回72或更多nothing@PanagiotisKanavos我不知道子查询背后的逻辑,但这可能是有效的。这与问题无关,嗨,兄弟!谢谢你的意见!正如你在我的问题中看到的,如果有相同的坐标,我需要平均速度。我的意思是,如果LAT:12.333和LON:14.555有3行,我只需要显示1行,而不是3行,并且显示这一行的平均速度。你介意修改一下你的答案吗?是否可以只使用1个查询进行归档,或者在本例中,逻辑本身更复杂?@DmitryBoyko这不是Nattan的查询已经做到的吗?给定问题中的数据,它每个坐标只返回一行。除非我遗漏了有关您的数据的某些内容,否则上面的查询应该会这样做。如果您只需要每lat/long一行,则必须从结果中删除[machine]并分组,因为包括这意味着您将获得每机器/lat/long一行。