現在のテーブル値を調べるソリューションは、複数のユーザーと複数のセッションと並列トランザクションを持つ「実際の」環境では機能しません。
私はあなたでは次の2つの要件を分離する必要があると思う:
- は、それらが
は一年以内に、レコードの順序を報告する能力を持って作成されたときに基づいてレコードを配列決定する能力を持っています。
これらは、このために正確に設計され、並行性(複数のユーザ、複数のトランザクション、...)を処理しているように、第1のシーケンスを使用して処理されます。
2つ目は報告要件であり、パフォーマンス要件に応じていくつかのオプションがあります。
まず第一には、シーケンスを作成します。
create sequence seq_analysis_id start with 1 increment by 1 nocache nocycle;
のは、ベーステーブルと自動インクリメントを処理するためのトリガを作成できませ:
create table analysis_data (
analysis_id integer not null,
analysis_date date not null
);
alter table analysis_data add constraint pk_analysis_data primary key (analysis_id);
create or replace trigger trg_analysis_data
before insert on analysis_data
for each row
begin
:new.analysis_id := seq_analysis_id.nextval();
end trg_analysis_data;
/
insert into analysis_data (analysis_date) values (to_date('2015-12-28', 'YYYY-MM-DD'));
insert into analysis_data (analysis_date) values (to_date('2015-12-29', 'YYYY-MM-DD'));
insert into analysis_data (analysis_date) values (to_date('2015-12-30', 'YYYY-MM-DD'));
insert into analysis_data (analysis_date) values (to_date('2015-12-31', 'YYYY-MM-DD'));
insert into analysis_data (analysis_date) values (to_date('2016-01-01', 'YYYY-MM-DD'));
insert into analysis_data (analysis_date) values (to_date('2016-01-02', 'YYYY-MM-DD'));
insert into analysis_data (analysis_date) values (to_date('2016-01-03', 'YYYY-MM-DD'));
commit;
select * from analysis_data;
ANALYSIS_ID ANALYSIS_DATE
1 28/12/2015
2 29/12/2015
3 30/12/2015
4 31/12/2015
5 01/01/2016
6 02/01/2016
7 03/01/2016
OK - すべてが正常に動作しますが、doesnのように、
これは第2の部分です:報告要件:
最初のオプションはちょうどあなたが動的に必要な数値を得ることです:分析関数(この場合はrow_number
)を使用して
select
analysis_id,
analysis_date,
extract(year from analysis_date) analysis_year,
row_number()
over (partition by trunc(analysis_date, 'YYYY')
order by analysis_date, analysis_id) analysis_number
from
analysis_data;
は、この種のものを処理するための素晴らしい方法です。
ANALYSIS_ID ANALYSIS_DATE ANALYSIS_YEAR ANALYSIS_NUMBER
1 28/12/2015 2015 1
2 29/12/2015 2015 2
3 30/12/2015 2015 3
4 31/12/2015 2015 4
5 01/01/2016 2016 1
6 02/01/2016 2016 2
7 03/01/2016 2016 3
私はrow_number
機能にanalysis_date, analysis_id
で注文しました。これはおそらく必要ではありませんが、analysis_date
への更新を処理しなければならない場合に必要になります(この場合、シーケンスは年内の注文にはもう機能しません)。
あなたはビューでそれをラップすることにより、このもう少し簡単なレポート作成のために作ることができます:
create or replace view analysis_data_v as
select
analysis_id,
analysis_date,
extract(year from analysis_date) analysis_year,
row_number()
over (partition by trunc(analysis_date, 'YYYY')
order by analysis_date, analysis_id) analysis_number
from
analysis_data;
これはあなたが必要なすべてのかもしれないが、あなたはその後、大規模なデータセットを持っている場合は、計算を事前にする必要があるかもしれませんこれらの値のいくつか。 11gに仮想列がありますが、これらは解析機能では機能しません。私のオプションは、ここにマテリアライズド・ビューを使用することです - マテリアライズド・ビューのリフレッシュを処理する方法の多くをし、最も単純なものは、次のようになります。
exec dbms_mview.refresh('analysis_data_mv');
:マテリアライズド・ビューを手動で更新されるだろう。この場合
create materialized view analysis_data_mv
build immediate
refresh complete on demand
as
select
analysis_id,
analysis_date,
analysis_year,
analysis_number
from
analysis_data_v;
select * from analysis_data_mv order by analysis_year, analysis_number;
ANALYSIS_ID ANALYSIS_DATE ANALYSIS_YEAR ANALYSIS_NUMBER
1 28/12/2015 2015 1
2 29/12/2015 2015 2
3 30/12/2015 2015 3
4 31/12/2015 2015 4
5 01/01/2016 2016 1
6 02/01/2016 2016 2
7 03/01/2016 2016 3
お役に立てれば。
列の値で挿入されるテーブルの同じ行を更新しますか? – XING
その列は更新されません。 – SantyEssac