Нужно сгенерировать "на сегодняшний день" из 2 (или более) разных "из дат" - PullRequest
1 голос
/ 02 ноября 2019

У меня есть таблица с идентификатором, ценой и датой. У меня нет "на сегодняшний день". Таким образом, у item1 может быть цена £ 50 с 01.01.2009 в одном ряду, тогда у item1 будет цена £ 55 с 01.012020 во втором ряду.

Если я хочучтобы узнать цену товара 1 сегодня, я не смог бы использовать WHERE today >= fromdate and <= todate.

Как мне добавить «todate»? Где todate за день до даты следующего ряда?

В идеале нужно сделать это как представление, если хотите, избегать создания таблиц / хранимых процедур?

Спасибо

Ответы [ 2 ]

2 голосов
/ 02 ноября 2019

Чтобы получить сегодняшнюю цену, получите строку с самой поздней датой, не превышающей сегодняшнюю:

select c.price
from cost c
where c.id = 'Item1'
and c.fromdate = (
  select max(fromdate) from cost
  where id = c.id and fromdate <= getdate() 
)

Или:

select top 1 price
from cost
where id = 'Item1' and fromdate <= getdate()
order by fromdate desc

Чтобы создать столбец с датами:

with cte as (
  select *, row_number() over (partition by id order by fromdate) rn
  from cost
)
select c.id, c.price, c.fromdate, dateadd(day, -1, cc.fromdate) todate
from cte c left join cte cc
on cc.id = c.id and cc.rn = c.rn + 1

См. Упрощенную демонстрацию .

1 голос
/ 02 ноября 2019

Как прокомментировал Питер Шнайдер, разумным вариантом было бы использовать оконную функцию lead() для восстановления fromdate следующей записи для того же id:

select 
    t.*, 
    lead(fromdate) over(partition by id order by fromdate) todate
from mytable t

Обратите внимание, что приВ этом методе для записи, имеющей наибольшее значение fromdate для каждого id, будет установлено todate на null. Если вы хотите назначить дату окончания по умолчанию, вы можете использовать coalesce().

. Вы можете поместить это в представление:

create view myview as
select 
    t.*, 
    lead(fromdate) over(partition by id order by fromdate) todate
from mytable t

И затем вы можете запросить представление для текущей цены. данного предмета:

select *
from myview
where 
    id = ? 
    and getdate() >= fromdate
    and (todate is null or getdate() < todate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...