mam mały problem z konstrukcja sql-ki do widoku
Mam tabele:
produkt, cena, data_start, data_stop
paprykarz, 10, 05-06-2011, 10-07-2011
fasola,5, 04-12-2011, 12-11-2011
paprykarz,11, 10-07-2011, 12-12-2011
paprykarz,15, 10-07-2011, null
Każda zmiana ceny jest odnotowywana przepisaniem dat.
Potrzebuje wyciągnąc dane w postaci:
data, produkt, akcja, stara cena, nowa cena
10-07-2011, paprykarz, wzrost ceny, 10, 11
Mam wrażenie że kiedyś był taki problem poruszany ale nie moge go znalaźć, więc byłbym wdzieczny za linka.
Rozwiąząłem problem, dla potomnych podaje draft sql-ki.
SELECT t.product_id, , t.start_date AS action_date, t.action_type, t.old_price, t.new_price FROM ( SELECT product.product_id, product.start_date, CASE WHEN avg(product.product_price) OVER v_window <> product.product_price THEN 'change'::text ELSE 'add'::text END AS action_type, 1 AS x_order, CASE WHEN first_value(product.product_price) OVER v_window <> last_value(product.product_price) OVER v_window THEN first_value(product.product_price) OVER v_window ELSE 0::numeric END AS old_price, last_value(product.product_price) OVER v_window AS new_price FROM product WINDOW v_window AS (PARTITION BY product.product_id ORDER BY product.start_date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) UNION SELECT do1.product_id, do1.end_date AS action_date, 'del'::text AS action_type, 2 AS x_order, 0 AS new_price, 0 AS old_price FROM product do1 WHERE do1.product_end_date IS NOT NULL AND NOT (do1.product_id IN ( SELECT do2.product_id FROM product do2 WHERE do2.product_id = do1.product_id AND do2.start_date = (do1.nd_date + 1)))) t JOIN product USING (product_id) ORDER BY t.product_id, t.start_date, t.x_order;