#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
.