【发布时间】: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 BY或AVG关键字。你尝试过什么吗?你遇到问题了吗? 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