Как получить запись по дате из 1 таблицы и обновить другую таблицу в Postgresql? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть две таблицы.В одной таблице (order_produt) есть несколько записей по дате, а в другой таблице (Transfer_product) также несколько записей по дате.Таблица order_product имеет правильную запись.я хочу обновить свою таблицу Transfer_product с помощью таблицы order_product по диапазону дат.

order_product_table
-------------------------

id    | date         | Product_id  | value 
-------------------------------------------
1     | 2017-07-01   | 2           | 53
2     | 2017-08-05   | 2           | 67
3     | 2017-10-02   | 2           | 83
4     | 2018-01-20   | 5           | 32
5     | 2018-05-01   | 5           | 53
6     | 2008-08-05   | 6           | 67


Transfer_product_table
----------------------------

id    | date         | Product_id  | value 
--------------------------------------------
1     | 2017-08-01   | 2           | 10
2     | 2017-10-06   | 2           | 20
3     | 2017-12-12   | 2           | 31
4     | 2018-06-25   | 5           | 5

Result(Transfer_product_table)
--------------------------------
id    | date         | Product_id  | value 
--------------------------------------------
1     | 2017-08-01   | 2           | 53
2     | 2017-10-06   | 2           | 83
3     | 2017-12-12   | 2           | 83
4     | 2018-06-25   | 5           | 53

Я хочу обновить по дате, как вы видите таблицу результатов.

Я использую разделение запроса по, но это не такчто я хочу.

UPDATE Transfer_product_table imp
SET    value = sub.value 
FROM  (SELECT product_id,value 
,ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY orderdate DESC)AS Rno
FROM order_product_table
where orderdate between '2017-07-01' and '2019-10-31') sub
WHERE  imp.product_id = sub.product_id 
and  sub.Rno=1
and imp.date between '2017-07-01' and '2019-10-31'

1 Ответ

0 голосов
/ 20 мая 2019

Это довольно просто, если использовать удивительный тип датрегирования postgres.

with order_product_table as (
select * from (
  VALUES (1, '2017-07-01'::date, 2, 53),
         (2, '2017-08-05', 2, 67),
         (3, '2017-10-02', 2, 83),
         (4, '2018-01-20', 5, 32),
         (5, '2018-05-01', 5, 53),
         (6, '2008-08-05', 6, 67)
) v(id, date, product_id, value)
), transfer_product_table as (
select * from (
  VALUES (1, '2017-08-01'::date, 2, 10),
         (2, '2017-10-06', 2, 20),
         (3, '2017-12-12', 2, 31),
         (4, '2018-06-25', 5, 5)
) v(id, date, product_id, value)
), price_ranges AS (
  select product_id,
         daterange(date, lead(date) OVER (PARTITION BY product_id order by date), '[)') as pricerange,
         value
  FROM order_product_table
)
SELECT id,
       date,
       transfer_product_table.product_id,
       price_ranges.value
FROM transfer_product_table
JOIN price_ranges ON price_ranges.product_id = transfer_product_table.product_id
  AND date <@ pricerange
ORDER BY id
;
 id |    date    | product_id | value
----+------------+------------+-------
  1 | 2017-08-01 |          2 |    53
  2 | 2017-10-06 |          2 |    83
  3 | 2017-12-12 |          2 |    83
  4 | 2018-06-25 |          5 |    53
(4 rows)

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

         daterange(date, lead(date) OVER (PARTITION BY product_id order by date), '[)') as pricerange,

Затем мы просто присоединяемся к этому при условии, что product_ids совпадают и эта дата в Transfer_product_table равнасодержится в ценовом диапазоне.

...