我对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
对于
我只想获取每个读者的平均差异。
您的查询非常好。我认为您的差额计算有误。 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
将完成您的期望。
如果仅需要平均差异,则可以使用以下查询:
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)
。