Получить только одну строку на идентификатор из SQL-запроса с заданным условием - PullRequest
0 голосов
/ 28 февраля 2019

Я использую Postgres v> 9.

Я хотел бы получить значения таблицы следующим образом:

id  year   value
1   2015   0.1
2   2015   0.2
6   2030   0.3
6   2015   0.4
6   2017   0.3

Идея состоит в том, чтобы получить строки с годами <2019 или год = 2030. Если идентификатор повторяется, я бы хотел получить только строку 2030, а не 2015, то есть результат, который я ищу: </p>

id  year   value
1   2015   0.1
2   2015   0.2
6   2030   0.3

Как мне это сделать?что?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019
 SELECT ID,
        FIRST_VALUE(YEAR) OVER (PARTITION BY ID ORDER BY YEAR DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS year,
        FIRST_VALUE(Value) OVER (PARTITION BY ID ORDER BY YEAR DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS value  
 FROM t 
 WHERE YEAR = 2030 OR YEAR < 2019

Я думаю, что это стандарт для first_value - postgre может потребоваться отдельное предложение?

0 голосов
/ 28 февраля 2019

При этом учитывается только 2030 год или любой год <2019. По крайней мере, так говорится в вопросе.(Я подозреваю, что там что-то нечеткое.) </p>

Он выбирает одну строку на id, причем последний год - на первом.

SELECT DISTINCT ON (id) *
FROM   tbl
ORDER  BY id, year DESC
WHERE (year = 2030 OR year < 2019);

Если может быть несколько строк с одинаковыми (id, year), вам нужен тай-брейк.
Об этом и других подробностях для DISTINCT ON:

0 голосов
/ 28 февраля 2019

Используйте distinct on, если вы хотите одну строку для идентификатора:

select distint on (id) t.*
from t
order by id, year desc;
...