PostgreSQL SELECT DISTINCT для составного первичного ключа - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть таблица с этой структурой:

Column    |  Type |
id        | int   | 
version   | int   |
status_id | int   |  // can be 1 active, 2 suspended, 3 removed
update    | Timestamp |
position  | Geometry  |

Indexes:
"PK_poi" PRIMARY KEY, btree (id, version)

Так что это моя структура таблицы, в основном что-то произойдет в Location, я создам это, затем что-то еще произойдет, и я обновлю событие сновая версия.

Таким образом, данные будут выглядеть как

 id         |  version  | status_id |  update              | position
 1          |  1        |   1       |  2018-09-17 10:52:48 | x,y 
 2          |  1        |   1       |  2018-09-17 10:52:48 | x,y
 2          |  2        |   1       |  2018-09-17 11:02:48 | x,y
 2          |  3        |   2       |  2018-09-17 11:22:48 | x,y
 1          |  2        |   2       |  2018-09-17 11:52:48 | x,y
 2          |  4        |   1       |  2018-09-17 12:52:48 | x,y
 1          |  3        |   3       |  2018-09-17 12:52:48 | x,y
 2          |  5        |   3       |  2018-09-17 13:52:48 | x,y
 3          |  1        |   1       |  2018-09-17 14:52:48 | x,y
 3          |  2        |   1       |  2018-09-17 14:52:48 | x,y
 4          |  1        |   1       |  2018-09-17 16:52:48 | x,y
 4          |  2        |   1       |  2018-09-17 16:52:48 | x,y

. Поэтому я пытаюсь выбрать удаленный пункт, который возвращает мне «последнюю» версию в течение указанного интервала времени на основеметка времени.Но только если «последняя» версия не со статусом - приостановлена ​​или удалена.

Так что, если в 17:52 я сделаю запрос в БД и скажу, предоставит мне последние события за последний час, я бы ожидал:

  id         |  version  | status_id |  update              | position
  4          |  2        |   1       |  2018-09-17 16:52:48 | x,y

если я скажу, однако, дайте мне последние события за последние 24 часа, я бы ожидал

  id         |  version  | status_id |  update              | position
  3          |  2        |   1       |  2018-09-17 14:52:48 | x,y
  4          |  2        |   1       |  2018-09-17 16:52:48 | x,y

Я очень запутался, как это сделать, из-за составного ключа,Можете ли вы дать указания о том, что именно я должен читать?

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

1 Ответ

0 голосов
/ 17 сентября 2018

Вам нужно row_number, чтобы получить последнее событие для каждого местоположения.

SELECT *
FROM ( SELECT *, 
              ROW_NUMBER() OVER (PARTITION BY id ORDER BY "update" DESC ) as rn
                                          -- ^^^ create a group for each id
       FROM yourTable           
       WHERE status_id = 1
         -- optional if you want the events in a time range
         AND "update" > current_timestamp - interval '1 day -- filter the last 24 h events
     ) as Q

-- optional if you want all events remove it.
WHERE rn = 1 -- filter the last one of each id because is order by update desc
...