Select records as groups based on sequence and date
Simple approach (can split sets)
Chain DELETE and INSERT with a data-modifying CTE for best performance and to be safe:
WITH del AS (
   DELETE FROM tbl t
   WHERE  udate &lt; (now() - interval '1 year')::date
   AND    EXISTS (  -- is not the greatest
      SELECT 1 FROM tbl
      WHERE  compid = t.compid
      AND    seq    &gt; t.seq
   RETURNING compid, seq, udate, utime
   )
INSERT INTO archive(compid, seq, udate, utime)
SELECT * FROM del;

This is assuming all columns to be defined NOT NULL (table definition is missing).
Depending on data distribution, there may be faster solutions.
I formulated the predicate Udate &lt; (now() - interval '1 year')::date to be sargable. You should have an index on Udate (at least).
Ignoring Utime. You should replace date and time with a single timestamp column: udatetime timestamp. Smaller, more efficient.
Avoid splitting sets
To keep rows older than a year if at least 1 row in the same set (compid, seq) is still younger than a year:
WITH del AS (
   DELETE FROM tbl t
   USING (
      SELECT compid, seq
      FROM   tbl d
      GROUP  BY 1,2
      HAVING max(udate) &lt; (now() - interval '1 year')::date
      AND    EXISTS (  -- is not greatest seq
         SELECT 1 FROM tbl
         WHERE  compid = d.compid
         AND    seq    &gt; d.seq
         )
      ) d
   WHERE  t.compid = d.compid
   AND    t.seq    = d.seq
   RETURNING t.compID, t.seq, t.udate, t.utime
   )
INSERT INTO archive(compid, seq, udate, utime)
SELECT * FROM del;

This first groups by compid, seq and checks if the maximum date in the group is old enough to be moved.
SQL Fiddle.