Как поместить определенные строки в определенную позицию в наборе результатов, postgresql - PullRequest
0 голосов
/ 18 октября 2018

рассмотрим таблицу с событиями:

| date         | name       | wanted position| 
----------------------------------------
| 01.01.2001   | game       | 
| 01.02.2001   | game       | 
| 01.03.2001   | game       | 
| 01.04.2001   | game       | 
| 01.05.2001   | tournament | 3
| 01.06.2001   | game       | 

Теперь я выбираю события из таблицы, упорядоченной по дате.Работает нормально, но с большим количеством строк турнир находится где-то в конце списка.Так что на самом деле никто этого не видит.Чтобы решить эту проблему, я хочу поставить турнир всегда на третью (или любую другую произвольную позицию в зависимости от ситуации) в наборе результатов, если дата турнира идет после даты фактического события на желаемой позиции.

Например, этонаборы результатов, которые я хотел бы иметь:

1-> турнир находится на третьем месте, хотя он находится позже в списке, если упорядочен по дате

| date         | name       | wanted position| 
----------------------------------------
| 01.01.2001   | game       | 
| 01.02.2001   | game       | 
| 01.05.2001   | tournament | 3
| 01.03.2001   | game       | 
| 01.04.2001   | game       | 
| 01.06.2001   | game       | 

2-> турнир находится на второмпозиция, потому что дата уже близка, а естественный порядок по дате работает просто отлично

| date         | name       | wanted position| 
----------------------------------------
| 01.04.2001   | game       | 
| 01.05.2001   | tournament | 3
| 01.06.2001   | game       | 
| 01.07.2001   | game       | 
| 01.08.2001   | game       | 

Возможно ли это как-то с помощью SQL?База данных postgresql.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Вы можете использовать row_number() в выражении регистра, например:

SELECT
    date, name
FROM (
    SELECT
        date
      , name
      , CASE
            WHEN name = 'tournament' THEN 3
            ELSE ROW_NUMBER() OVER (ORDER BY date DESC)
        END rn
    FROM mytable
) d
order by rn, name DESC
0 голосов
/ 18 октября 2018

Вы всегда можете легко сделать это первым:

select t.*
from t
order by (name = 'tournament')::int desc,
         date;

Сделать его третьим немного сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...