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

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

id, date, value
a,  5/22/2019 11:00, 2211
b,  5/22/2019 11:00, 2211
c,  5/22/2019 11:00, 2211
a,  5/22/2019 10:00, 2210
b,  5/22/2019 10:00, 2210
c,  5/22/2019 10:00, 2210
a,  5/21/2019 17:00, 2117
b,  5/21/2019 17:00, 2117
c,  5/21/2019 17:00, 2117
a,  5/21/2019 15:00, 2115
b,  5/21/2019 15:00, 2115
c,  5/21/2019 15:00, 2115

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

id, latest, previous_date_close
a,   2211,    2117
b,   2211,    2117
c,   2211,    2117

Пока у меня есть некоторыедетали работают (текущий и предыдущий ряд), но нуждаются в текущем и последнем из предыдущей даты:

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

Спасибо.

Ответы [ 2 ]

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

Хммм. , , Я думаю, что два уровня оконных функций делают то, что вы хотите:

with cte as (
      select id, value,
             lag(value, 1, 0) over (partition by id order by date ) as "date - 1",
             row_number() over (partition by id order by date desc) as rn
      from (select t1.*,
                   row_number() over (partition by id, to_date(date) order by date desc) as seqnum_id_day
            from table1 t1
           ) t1
     where seqnum_id_day = 1
    )
select *
from cte
where rn = 1;
0 голосов
/ 23 мая 2019

Вы можете сделать это с двумя CTE.

WITH myCte AS (
SELECT 
    id, 
    value,
    row_number() over(PARTITION BY id ORDER BY date DESC) rn
FROM 
    table1
),

myOtherCte AS (
SELECT
    a.id,
    a.svalue,
    row_number() over(PARTITION BY a.id ORDER BY a.date DESC) rn
FROM
    table1 a
WHERE
    CAST(a.date AS DATE) < (SELECT MAX(CAST(b.date AS DATE))
                                                   FROM table1 b
                                                   WHERE a.id = b.id)
)   

SELECT
  t1.id,
  t1.value,
  t2.value
FROM myCte t1
JOIN myOtherCte t2 ON t1.id = t2.id
WHERE t1.rn = 1
AND t2.rn = 1

Вот демонстрация этого в действии: SQL Fiddle

...