SQL计算列之间的差异

问题描述 投票:-1回答:2

我对SQL有点陌生,我不太了解在这里做什么,因此,我们非常感谢您的帮助。我有一张桌子,上面满是来自不同读者的阅读资料,其中有500.000,所以我无法手工完成。

我收到的桌子没有差别。我设法进行了计算,但是那里有些问题...

看起来有点像这样:

reader_id |    date    | reading | difference
   1      | 01-01-2013 |   205   |     0
   1      | 02-01-2013 |   210   |     5
   1      | 03-01-2013 |   213   |     3
  ...     |     ...    |   ...   |    ...
   1      | 31-12-2013 |   2451  |     4
   2      | 01-01-2013 |   8543  |    6092
   2      | 02-01-2013 |   8548  |     5

reader_id和日期构成主键。组合是唯一的。

当最后一列包含不同的reader_id时,如何确保没有得到计算出的差值?

[用这样的查询查询数据时,由于两个reader_id之间的不正确差异而使数据偏斜:

SELECT AVG(difference), reader_id FROM table GROUP BY reader_id
mysql sql calculated-columns
2个回答
1
投票

对于

我只想获取每个读者的平均差异。

您的查询非常好。我认为您的差额计算有误。 reader_id = 2的第一个值6092是来自reader1的最后一个读数与来自阅读器2的第一个读数之差,我认为这没有道理。如果我没记错的话,差值就是当天的读数-前一天的读数。因此,您应该将每个阅读器的第一个读数的差值设置为0。

您可以使用以下查询进行此操作:

UPDATE table t INNER JOIN (SELECT reader_id, min(date) as first_day FROM table GROUP BY reader_id) as tmp ON tmp.reader_id=t.reader_id AND tmp.first_day=t.date SET t.difference=0

然后

SELECT AVG(difference), reader_id FROM table GROUP BY reader_id

将完成您的期望。


0
投票

如果仅需要平均差异,则可以使用以下查询:

SELECT
    meter_id,
    MAX(reading) - MIN(reading) / COUNT(*) average_difference
FROM table
GROUP BY meter_id
ORDER BY meter_id;

在逻辑上,给定meter_id的总差应等于MAX(reading) - MIN(reading)

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