get unique records from last 6 months
This type of queries are sometimes called "greatest-n-pre-group" (there's even a tag for these questions at SO!) and there are various ways to write them.

Assuming that the (customer_id, last_updated_on) is unique - i.e. there are no two rows with same last_update_on timestamp for the same customer - then you could first GROUP BY customer_id and get the maximum timestamp in a derived table and then join to the original table. Like this:
-- query 1

SELECT s.* 
FROM 
    ( SELECT customer_id,
             MAX(last_update_on) AS last_update_on
      FROM some_table
      WHERE redeemption_date &gt; CURDATE() - INTERVAL 6 MONTH 
        AND wallet_status &lt;&gt; 'EXPIRED'
      GROUP BY customer_id
    ) AS m
  JOIN
    some_table AS s
      ON  s.customer_id = m.customer_id
      AND s.last_update_on = m.last_update_on 
WHERE s.redeemption_date &gt; CURDATE() - INTERVAL 6 MONTH 
  AND s.wallet_status &lt;&gt; 'EXPIRED';


Another variation is to first find the customer ids (similarly to above) but then join to the table using a correlated subquery. This is often more efficient if one can find easily the distinct customer ids (so, perhaps not in your case). Here is how it can be done, so you can test both:
-- query 2

SELECT s.* 
FROM 
    ( SELECT customer_id
      FROM some_table
      GROUP BY customer_id
    ) AS d
  JOIN
    some_table AS s
      ON  s.wallet_id =                   -- the PRIMARY KEY 
          ( SELECT si.wallet_id           -- of the table
            FROM some_table AS si         
            WHERE si.customer_id = d.customer_id
              AND si.redeemption_date &gt; CURDATE() - INTERVAL 6 MONTH 
              AND si.wallet_status &lt;&gt; 'EXPIRED'
            ORDER BY si.last_update_on DESC
              LIMIT 1
          );