Обсуждение: Вывести последнюю цену товара и когда она была назначена.
Добрый день
Есть таблица tov(x,tname)
И есть таблица price(x,dat::tz, sum::money)
Необходимо вывести таблицу
tov.x, tov.tname, price.dat, price.sum
По всем значениям из таблицы tov, причём поля dat и sum должны выводиться только последние значения по дате, либо NULL.
Это можно сделать через триггер и дополнительные поля, но можно ли это сделать через а-ля SELECT
Никак не соображу.
Подскажите, пожалуйста!
Re: [pgsql-ru-general] Вывести последнюю цену товара и когда она была назначена.
От
Иван Фролков
Дата:
> Добрый день > Есть таблица tov ( x , tname ) > И есть таблица price ( x , dat :: tz , sum :: money ) > Необходимо вывести таблицу > tov.x, tov.tname, price.dat, price.sum > По всем значениям из таблицы tov , причём поля dat и sum должны выводиться только последние значения по дате, либо NULL . > Это можно сделать через триггер и дополнительные поля, но можно ли это сделать через а-ля SELECT > Никак не соображу. select tov.x. tov.name, price.dat, price.sum from tov left outer join lateral(select * from price where price.x=tov.x order by price.dat desc limit 1) on true
Re: Re: [pgsql-ru-general] Вывести последнюю цену товара и когда она была назначена.
От
Dmitriy Olshevskiy
Дата:
привет!
с lateral только с версии 9.3. у меня же есть вариант
с оконной функцией rank(), которая даже в 8.4. есть)
select tov.x, tov.tname, pr.dat, pr.sum
from tov
left join (
select x, dat, sum
, rank() over(partition by x order by dat desc)
from price
) pr on pr.x = tov.x
and pr.rank = 1;
On 02/09/2016 02:50 PM, Иван Фролков wrote:
>> Добрый день
>> Есть таблица tov ( x , tname )
>> И есть таблица price ( x , dat :: tz , sum :: money )
>> Необходимо вывести таблицу
>> tov.x, tov.tname, price.dat, price.sum
>> По всем значениям из таблицы tov , причём поля dat и sum должны выводиться только последние значения по дате,
либо NULL .
>> Это можно сделать через триггер и дополнительные поля, но можно ли это сделать через а-ля SELECT
>> Никак не соображу.
> select tov.x. tov.name, price.dat, price.sum
> from tov left outer join lateral(select * from price where price.x=tov.x order by price.dat desc limit 1) on true
>
>
>
--
Dmitriy Olshevskiy