2016-09-27 10 views
0

次の問題の解決策を見つける必要があります。Oracleは複数の行を新しいビューに正規化します

内部の郵便配達員は、まずメールボックスのQRバーコードとメールボックスに入れた各(内部の)文字のデータ・マトリックス・バーコードをスキャンする必要があります。彼のスキャナデバイスから

データは

|----|---------------------|--------------|---------------| 
| ID |  SCAN_DATE  | BAROCDE_TYPE | BARCODE_VALUE | 
----------------------------------------------------------| 
| 1 | 2016/02/01 08:10:30 |  QR  | Dept_HR  | 
| 2 | 2016/02/01 08:10:35 |  DM  | Lett_1  | 
| 3 | 2016/02/01 08:10:38 |  DM  | Lett_3  | 
| 4 | 2016/02/01 08:10:41 |  DM  | Lett_6  | 
| 5 | 2016/02/01 08:16:37 |  QR  | Dept_FI  | 
| 6 | 2016/02/01 08:16:38 |  DM  | Lett_2  | 
| 7 | 2016/02/01 08:16:40 |  DM  | Lett_4  | 
|----|---------------------|--------------|---------------| 

は私がしたい、次の形式でのOracle 11gデータベース・テーブルに格納された「正常化?」前述したように、私はデータを示すOracleデータベース・ビューを作成する方法を次の形式 におけるデータベース・ビューへのデータ(それが簡単にどのメールボックスに配信された文字を参照する場合)

|---------------------|------------|---------------------|----------| 
| ScanDate Postbox | Department | ScanDate Letter | LetterID | 
|---------------------|------------|---------------------|----------| 
| 2016/02/01 08:10:30 | Dept_HR | 2016/02/01 08:10:35 | Lett_1 | 
| 2016/02/01 08:10:30 | Dept_HR | 2016/02/01 08:10:38 | Lett_3 | 
| 2016/02/01 08:10:30 | Dept_HR | 2016/02/01 08:10:41 | Lett_6 | 
| 2016/02/01 08:16:37 | Dept_FI | 2016/02/01 08:16:38 | Lett_2 | 
| 2016/02/01 08:16:37 | Dept_FI | 2016/02/01 08:16:40 | Lett_4 | 
|---------------------|------------|---------------------|----------| 

任意のアイデア?

+0

私はあなたが**安全**メールボックスに文字を関連付けることができる方法を確認するために失敗しています。 1番目の表に列がない場合 – Ted

+0

'QR'の後に表示される「DM」はその部門に関連付けられていますか? – JohnHC

+0

@JohnHC - あなたはその前提を作ることができますが、それはどれくらい安全ですか? – Ted

答えて

1

私はPostboxレコードが文字レコードの前のレコードだと思います。安全でない関連付けがあるため、これは悪いことです。

次の選択は、ジョブを実行する必要があります。

-- Your testdata 
with data(id, 
scan_date, 
barcode_type, 
barcode_value) as 
(select 1, 
     to_date('2016/02/01 08:10:30', 'YYYY/MM/DD HH24:MI:SS'), 
     'QR', 
     'Dept_HR' 
    from dual 
    union all 
    select 2, 
     to_date('2016/02/01 08:10:35', 'YYYY/MM/DD HH24:MI:SS'), 
     'DM', 
     'Lett_1' 
    from dual 
    union all 
    select 3, 
     to_date('2016/02/01 08:10:38', 'YYYY/MM/DD HH24:MI:SS'), 
     'DM', 
     'Lett_3' 
    from dual 
    union all 
    select 4, 
     to_date('2016/02/01 08:10:41', 'YYYY/MM/DD HH24:MI:SS'), 
     'DM', 
     'Lett_6' 
    from dual 
    union all 
    select 5, 
     to_date('2016/02/01 08:16:37', 'YYYY/MM/DD HH24:MI:SS'), 
     'QR', 
     'Dept_FI' 
    from dual 
    union all 
    select 6, 
     to_date('2016/02/01 08:16:38', 'YYYY/MM/DD HH24:MI:SS'), 
     'DM', 
     'Lett_2' 
    from dual 
    union all 
    select 7, 
     to_date('2016/02/01 08:16:40', 'YYYY/MM/DD HH24:MI:SS'), 
     'DM', 
     'Lett_4' 
    from dual) 

-- Select 
select dp.scan_date  as "ScanDate Postbox", 
     dp.barcode_value as "Departement", 
     d.scan_date  as "ScanDate Letter", 
     d.barcode_value as "LetterId" 
    from data dp, data d 
where d.barcode_type = 'DM' 
    and dp.barcode_type = 'QR' 
    and dp.scan_date = 
     (select max(dpp.scan_date) 
      from data dpp 
     where dpp.barcode_type = dp.barcode_type 
      and dpp.scan_date <= d.scan_date); 
関連する問題