Заказ Round Robin в postgresql - PullRequest
       1

Заказ Round Robin в postgresql

1 голос
/ 02 августа 2020

Предположим, у нас есть эта таблица: (каждый объект может иметь экземпляр несколько раз, но с разным временем, например, объект A имеет два экземпляра 1)

  object   | instance | time
-----------------------------
   A       |    1     |  100
   A       |    1     |  99
   A       |    5     |  5
   A       |    5     |  3
   A       |    5     |  4
   A       |    3     |  10
   B       |    9     |  17
   B       |    9     |  18
   B       |    2     |  20

Я хочу заказать эту таблицу, чтобы объекты упорядочиваются циклически, но все строки с одним и тем же экземпляром должны объединяться, упорядоченные по времени)

The result should be:
    object     | instance | time
    -----------------------------
       A       |    5     |  3
       A       |    5     |  4
       A       |    5     |  5
       B       |    9     |  17
       B       |    9     |  18
       A       |    3     |  10
       B       |    2     |  20
       A       |    1     |  99
       A       |    1     |  100  

 

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Попробуйте следующее:

with cte as 
(select distinct on (object, instance) object,
        instance, 
        rank() over (partition by object order by time)  
        from example order by object, instance, time

)

select 
t1.*
from 
example t1 
left join cte t2 on t1.object=t2.object and t1.instance=t2.instance 
order by t2.rank,t1.object,t1.time

DEMO

0 голосов
/ 02 августа 2020

Хммм. . . вы можете использовать WINDOW функции:

order by dense_rank() over (partition by object order by instance),
         object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...