Вы можете создать psuedo PK с помощью оконной функции ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY <column>) as PK_Key
, но это будет неоптимальным, поскольку для каждого выбора будет упорядочена вся таблица.
Лучший способ сделать это состоит в том, чтобы разделить ваш оператор по индексам, которые у вас есть, а не по ровно 1 миллионам строк. То есть, изучите некоторые из ваших данных и выберите произвольный предел, который достигает того, что вы хотите. Если у вас примерно 1 миллион строк в месяц, то для каждой операции поиска данных получите данные за месяцы. Вам даже не понадобится CTE для этого, так как по звукам вы не имеете дело с рекурсивными структурами данных.