SELECT VERS.COLLID , VERS.PROGNAME , VERS.BIND_TIME , COUNT(*) FROM ( SELECT PKGS.COLLID , PKGS.PROGNAME , PKGS.BIND_TIME FROM ( SELECT COLLID , PROGNAME , BIND_TIME FROM plan_table ) AS PKGS WHERE :keepvers <= ( SELECT COUNT(DISTINCT CNT.BIND_TIME) FROM plan_table CNT WHERE CNT.COLLID = PKGS.COLLID AND CNT.PROGNAME = PKGS.PROGNAME AND CNT.BIND_TIME > PKGS.BIND_TIME ) ) AS VERS WHERE DATE(VERS.BIND_TIME) < DATE(CURRENT TIMESTAMP - :keepage DAYS) GROUP BY VERS.COLLID , VERS.PROGNAME , VERS.BIND_TIME ORDER BY VERS.COLLID , VERS.PROGNAME , VERS.BIND_TIME DESC ;