Retrieve latest 3 values from a large table
Check:

SELECT meterid /* , IF(SUM(metervalue&gt;0),1,0) flag */
FROM ( SELECT t.*,
              IF(@meterid=t.meterid, 
                 @rownum:=@rownum+1, 
                 @rownum:=1+least(0,@meterid:=t.meterid)) rown 
       FROM meterreadings t, 
            (SELECT @rownum:=1, @meterid:=0) vars
       /* WHERE t.date_time &gt; @some_date_time */
       ORDER BY meterid, date_time DESC
     ) nums
WHERE rown &lt; 4
GROUP BY meterid
HAVING SUM(metervalue&gt;0) &gt; 0 


The resultset is a list of meterid's which have at least 1 positive value within last 3 values. 

Commented WHERE allows to decrease the amount of records processed by setting some "start point".

If you need full list of meterid's with a 'flag' of positive value existence - remove HAVING condition and uncomment flag field in the output list.