Ниже для BigQuery Standard SQL
Я вижу два одинаково разумных варианта для вас
Вариант 1 - просто добавьте другое поле как ie прерыватель
В вашем случае order_id
выглядит так, как будто оно должно работать, поскольку оно, скорее всего, уникально в вашей таблице - поэтому ниже должно работать
#standardSQL
SELECT DISTINCT
account_id,
order_id,
order_validfrom_date AS start_date,
order_validto_date AS end_date,
RANK() OVER(
PARTITION BY account_id
ORDER BY order_validfrom_date DESC, order_validto_date DESC, order_id DESC -- added order_id here < this is the only change
) AS ranking,
FROM `datamart_dimsum.rpt_dly_dimsum_subscription_details`
WHERE order_validfrom_date <= '2020-01-14'
AND account_id IN (216223)
ORDER BY account_id, order_id DESC, order_validfrom_date, order_validto_date
Вариант 2 - просто замените RANK на ROW_NUMBER, как в примере ниже
#standardSQL
SELECT DISTINCT
account_id,
order_id,
order_validfrom_date AS start_date,
order_validto_date AS end_date,
ROW_NUMBER() OVER( -- ROW_NUMBER instead of RANK is the only change here
PARTITION BY account_id
ORDER BY order_validfrom_date DESC, order_validto_date DESC
) AS ranking,
FROM `datamart_dimsum.rpt_dly_dimsum_subscription_details`
WHERE order_validfrom_date <= '2020-01-14'
AND account_id IN (216223)
ORDER BY account_id, order_id DESC, order_validfrom_date, order_validto_date
Обе опции приведут к выводу ниже
Row account_id order_id start_date end_date ranking
1 216223 482847 2017-10-09 2017-11-08 1
2 216223 472121 2017-10-09 2017-11-08 2
3 216223 312312 2017-10-09 2017-11-08 3