Use the row_number function (assuming you are using SQL 2005 or later)SELECT BD.BDCUST,
BD.BDCAT,
BD.BDQTY,
BD.BDVUC,
BD.BDTOPN
FROM
(
SELECT BD.BDCUST,
BD.BDCAT,
BD.BDQTY,
BD.BDVUC,
BD.BDTOPN,
ROW_NUMBER() OVER (PARTITION BY BDCUST,BDCAT ORDER BY BDTOPN DESC) AS NN
FROM GALF2.BD BD
WHERE (BD.BDTOPN BETWEEN 20120101 AND 20130113)
AND (BD.BDCAT >= '2300000')
) r
WHERE NN = 1
ORDER BY
BDCAT,
BD.BDTOPN DESC