Функции окна Postgres — разделение rank() с помощью bigint

#sql #postgresql #window-functions

#sql #postgresql #оконные функции

Вопрос:

Я пытаюсь ранжировать данные по разделу по столбцу, тип которого bigint, но это не работает, когда я меняю столбец в разделе на столбец типа timestamp с часовым поясом, это работает.

Мой запрос выглядит следующим образом:

 select id,ts_insert,serial_no,rank() over (partition by serial_no order by serial_no desc) from schema.table_name
  

Результат выглядит следующим образом:

 1,'2019-02-19 18:27:50.258846 11',19516,1
1,'2019-02-19 18:27:50.258846 11',19515,1
1,'2019-02-19 18:27:50.258846 11',19514,1
1,'2019-02-06 19:45:38.896062 11',15069,1
1,'2019-02-05 21:46:28.633325 11',14827,1
  

Ожидаемый результат:

 1,'2019-02-19 18:27:50.258846 11',19516,1
1,'2019-02-19 18:27:50.258846 11',19515,2
1,'2019-02-19 18:27:50.258846 11',19514,3
1,'2019-02-06 19:45:38.896062 11',15069,4
1,'2019-02-05 21:46:28.633325 11',14827,5
  

Кто-нибудь может мне помочь, пожалуйста?

Заранее спасибо…

Ответ №1:

Кажется, вы хотите:

 select id, ts_insert, serial_no,
       rank() over (partition by id order by serial_no desc)
from schema.table_name;
  

serial_no является уникальным (по крайней мере, в предоставленных вами данных). Если вы разделяете по уникальному столбцу, то rank() всегда будет 1 .

Комментарии:

1. Это правильно, serial_no уникален, спасибо за ваш ответ. Что я могу использовать, чтобы выбрать наибольшее значение в столбце serial_no?

2. @Victor . . . Это то, что order by делает. Если вы хотите отфильтровать результаты, используйте подзапрос и добавьте where rnk = 1 .