2016-11-18 2 views
0

У меня есть следующая таблица с двумя столбцами.PostgreSQL: получить первую и последнюю вставленную запись для каждого столбца ID

Таблица:

create table tbl1 
(
    p_id int, 
    p_price int 
); 

Вставка:

INSERT INTO tbl1 values(1,100); 
INSERT INTO tbl1 values(1,50); 
INSERT INTO tbl1 values(1,20); 

INSERT INTO tbl1 values(2,10); 
INSERT INTO tbl1 values(2,20); 

INSERT INTO tbl1 values(3,22); 
INSERT INTO tbl1 values(3,89); 
INSERT INTO tbl1 values(3,500); 

запроса: После запроса дает мне номер строки каждой строки.

SELECT p_id,p_price,row_number() over(partition by p_id order by p_id) rn 
from tbl1 

Я хочу получить только первую и последнюю вставленную запись для каждого идентификатора продукта (p_id).

Ожидаемый результат:

p_id p_price  
----------------- 
1 100 
1 20 
2 10 
2 20 
3 22 
3 500 
+2

В Postgres и большинстве разновидностей SQL нет «первой» и «последней» вставленной записи. Здесь вам нужно будет определить какой-то порядок. –

+2

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

+0

Попробуйте использовать другой столбец как 'createdDate' который регистрирует дату и время записи. – Viki888

ответ

1

Вы можете сделать это с помощью подзапроса:

SELECT p_id, p_price, rn from (
    SELECT *, last_value(rn) over(partition by p_id) as last from (
    SELECT p_id,p_price,row_number() over(partition by p_id order by p_id) rn 
    FROM tbl1 
) s1 
) s2 where rn=1 or rn=last; 

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

+0

это не первый и последний вставленный. результат будет меняться со временем для одного и того же 'p_id' –

+0

@VaoTsun да, вы правы, не сохраняя последовательность или дату вставки, это не обязательно верно вернет первые и последние вставленные строки. Если это необходимо, таблица может быть расширена и запрос изменен для этого. В конечном счете идентификатор не является ПК в примере. ПК может содержать, например, время вставки. – quantummind