SQL - Как получить только текущее и предыдущее значение для каждого идентификатора - PullRequest
1 голос
/ 22 мая 2019

У меня есть таблица

id, date, value
a,  5/22/2019, 22
b,  5/22/2019, 22
c,  5/22/2019, 22
a,  5/21/2019, 21
b,  5/21/2019, 21
c,  5/21/2019, 21
a,  5/20/2019, 20
b,  5/20/2019, 20
c,  5/20/2019, 20

Хотите получить идентификатор и значение текущей (самой последней) и предыдущей даты:

id, date, date-1
a, 22, 21
b, 22, 21
c, 22, 21

Пока у меня есть некоторые детали, но нужны только 1Идентификатор в строке (ниже приведено более 1 строки для каждого идентификатора - в следующей строке будет отображаться дата 5/20 для того же идентификатора, что неверно):

select 
    id, value,
    lag(value, 1, 0) over (partition by id order by date ) as "date - 1"
from 
    table1

Как этого добиться?

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Как насчет этого? Обратите внимание, что я назвал столбец ddate вместо даты:

create table a_test(id varchar(1), ddate date, value int);

insert into a_test values ('a',  '5/22/2019', 22),
                          ('b',  '5/22/2019', 22),
                          ('c',  '5/22/2019', 22),
                          ('a',  '5/21/2019', 21),
                          ('b',  '5/21/2019', 21),
                          ('c',  '5/21/2019', 21),
                          ('a',  '5/20/2019', 20),
                          ('b',  '5/20/2019', 20),
                          ('c',  '5/20/2019', 20);

with cte as(
select id,
       value,
       row_number() over(partition by id order by ddate desc) as rn
from a_test)

select id,
       MAX(value) FILTER (WHERE rn = 1) as col1,
       MAX(value) FILTER (WHERE rn = 2) as col2
from cte
group by id
1 голос
/ 22 мая 2019

вы можете попробовать как ниже

with cte as
(
select 
    id, value,
    lag(value, 1, 0) over (partition by id order by date ) as "date - 1",
    lag(value, 2, 0) over (partition by id order by date ) as "date - 2",
    row_number() over(partition by id order by date desc) rn
from 
    table1
) select * from cte where rn=1
...