2016-09-27 4 views
0

Ich muss eine Lösung für das folgende Problem finden.Oracle normalisieren mehrere Zeilen in neue Ansicht

Der interne Postbote muss zuerst einen QR-Barcode auf einer Mailbox und einen Datamatrix-Barcode auf jedem (internen) Brief, den er in die Mailbox legt, scannen.

Die Daten aus dem Scanner-Gerät

|----|---------------------|--------------|---------------| 
| 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  | 
|----|---------------------|--------------|---------------| 

Ich möchte im folgenden Format in eine Oracle 11g Datenbank-Tabelle gespeichert zu "normalisieren?" die Daten in eine Datenbank-Ansicht in folgendem Format (wo es leicht, welcher Buchstaben geliefert wurde, um zu sehen, an der Mailbox)

|---------------------|------------|---------------------|----------| 
| 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 | 
|---------------------|------------|---------------------|----------| 

Irgendwelche Ideen, wie ich die Daten eine Oracle-Datenbank-Ansicht erstellen kann zeigen, wie oben beschrieben ?

+0

Ich bin Fehler zu sehen, wie Sie können ** ** sicher den Brief mit dem Briefkasten in Verbindung bringen. Es sei denn, es gibt mehr Spalten in der ersten Tabelle – Ted

+0

Ist ein "DM", der nach einem "QR" angezeigt wird, mit dieser Abteilung verknüpft? – JohnHC

+0

@ JohnHC - Sie können diese Annahme machen, aber wie sicher ist es? – Ted

Antwort

1

Ich denke, der Postbox-Datensatz ist der vorherige Datensatz in den Briefsätzen. Dies ist eine schlechte, weil unsichere Zuordnung.

folgende Auswahl treffen sollte die Arbeit machen:

-- 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);