hier zu tun, ist eine Möglichkeit, eine Ansicht von Ihren Basisdaten zu erstellen. Ich nehme an, Sie haben mehr als ein Produkt (identifiziert durch Produkt-ID), und dass die Preisdaten nicht unbedingt aufeinander folgen. Die Reihenfolge ist für jede Produkt-ID separat. (Auch product
sollte der Name einer anderen Tabelle sein - wobei die Produkt-ID der Primärschlüssel ist und Sie andere Informationen wie Produktname, Kategorie usw. haben. Die Tabelle in Ihrem Beitrag würde eher wie price_history
heißen.)
alter session set nls_date_format='dd-MON-rr';
create table product (prod_id number, dt date, price number);
insert into product (prod_id, dt, price)
select 101, '02-SEP-14', 50 from dual union all
select 101, '03-SEP-14', 60 from dual union all
select 101, '04-SEP-14', 60 from dual union all
select 101, '05-SEP-14', 60 from dual union all
select 101, '07-SEP-14', 71 from dual union all
select 101, '08-SEP-14', 45 from dual union all
select 101, '09-SEP-14', 45 from dual union all
select 101, '10-SEP-14', 24 from dual union all
select 101, '11-SEP-14', 60 from dual union all
select 102, '02-SEP-14', 45 from dual union all
select 102, '04-SEP-14', 45 from dual union all
select 102, '05-SEP-14', 60 from dual union all
select 102, '06-SEP-14', 50 from dual union all
select 102, '09-SEP-14', 60 from dual
;
commit;
create view product_vw (prod_id, dt, price, seq) as
select prod_id, dt, price,
count(flag) over (partition by prod_id order by dt)
from (select prod_id, dt, price,
case when price = lag(price) over (partition by prod_id order by dt)
then null else 1 end as flag
from product
)
;
überprüfen Sie nun, was die Ansicht wie folgt aussieht:
select * from product_vw;
PROD_ID DT PRICE SEQ
------- ------------------- ---------- ----------
101 02/09/0014 00:00:00 50 1
101 03/09/0014 00:00:00 60 2
101 04/09/0014 00:00:00 60 2
101 05/09/0014 00:00:00 60 2
101 07/09/0014 00:00:00 71 3
101 08/09/0014 00:00:00 45 4
101 09/09/0014 00:00:00 45 4
101 10/09/0014 00:00:00 24 5
101 11/09/0014 00:00:00 60 6
102 02/09/0014 00:00:00 45 1
102 04/09/0014 00:00:00 45 1
102 05/09/0014 00:00:00 60 2
102 06/09/0014 00:00:00 50 3
102 09/09/0014 00:00:00 60 4
Wo hat der erste Preis (50) kommen aus? Es ist im gewünschten Ergebnis, aber nicht in den Eingaben. Dann: Ordnen Sie eine neue Nummer zu, wenn der neue Preis von dem unmittelbar vorhergehenden abweicht? Oder nur, wenn es für die gesamte Sequenz neu ist? Sagen Sie also zum Beispiel, dass 11-SEP-14 den Preis 60 hat. Ordnen Sie die Nummer 6 zu, oder ordnen Sie die Nummer 2 zu? – mathguy
Auch: Möchten Sie diese Daten wirklich SPEICHERN, oder ist es besser, eine Ansicht zu erstellen, in der die Spalte dynamisch berechnet wird? Wenn Sie diese in Ihrer Basistabelle speichern, was tun Sie, wenn Sie die Basisdaten ändern müssen (z. B. eine Korrektur des Preises 04-SEP-14, Aktualisierung von 60 auf 55)? – mathguy
Ich habe gerade die Frage bearbeitet. Ich hoffe jetzt ist es besser zu verstehen. –