BigQuery продублированные числа rank () - PullRequest
1 голос
/ 15 января 2020

У меня есть таблица транзакций с account_no, order_id, start_date, end_date и рейтинга. Я пытаюсь ранжировать транзакции по дате их начала и окончания. Но проблема в том, что все транзакции имеют одинаковые даты начала и окончания, я не могу ранжировать транзакции на основе их даты.

Мой код

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  ) 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,order_validfrom_date,order_validto_date  

Вывод

account_id | order_id |  start_date  | end_date   | ranking
  216223     482847      2017-10-09    2017-11-08      1
  216223     472121      2017-10-09    2017-11-08      1
  216223     312312      2017-10-09    2017-11-08      1

Есть ли способ присвоить первой транзакции 1 значение, несмотря на одинаковые даты начала и окончания? Я пробовал функцию ROW_NUMBER (), но не смог.

Ответы [ 3 ]

1 голос
/ 15 января 2020

Используйте row_number(). rank() должен возвращать дубликаты:

 row_number() over (partition by account_id
                    order by order_validfrom_date desc, order_validto_date desc
                   ) as ranking, 
0 голосов
/ 16 января 2020

Ниже для 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    
0 голосов
/ 15 января 2020

Вы пытались добавить order_id в предложении ORDER BY?

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, order_id 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,order_validfrom_date,order_validto_date
...