2017-12-15 8 views
0

Ich habe eine Tabelle mit IDs, die nicht eindeutig sind. Es gibt ein Datumsfeld und einen Feldtitel RISK mit Werten wie "Keine", "Niedrig", "Mittel", "Hoch". Es sieht wie folgt aus:Wie verwende ich eine case-Anweisung, um einen Wert aus einer anderen Zeile zuzuweisen?

ID Date Risk 
    1743333 12/1/2017 Low 
    1743333 12/2/2017 Low 
    1743333 12/3/2017 None 
    1743333 12/4/2017 None 
    1743333 12/5/2017 Medium 
    1743333 12/6/2017 High 
    1265464 12/1/2017 High 
    1265464 12/2/2017 None 
    1265464 12/3/2017 None 
    1265464 12/4/2017 None 
    1265464 12/5/2017 High 
    1265464 12/6/2017 High 

das Risiko Feld durch andere Datenpunkte und Berechnungen im Code eingebaut Ich habe oder nicht genau wissen, was die Kriterien für sie ist. Der Wert "None" wird im Wesentlichen zugewiesen, wenn aufgrund der Berechnungskriterien nicht genügend Informationen vorhanden sind, um Low, Med oder High zuzuweisen. Was ich versuche zu tun ist, wo die Werte in RISK = 'None' sind, möchte ich den RISK-Wert der vorherigen Zeile basierend auf dem vorherigen Datum (1 Tag früher) innerhalb dieser bestimmten ID zuweisen. Wenn also RISK an einem bestimmten Tag alles andere als "None" ist und dann "None" wird, wenn die Tage fortschreiten, möchte ich den vorherigen letzten Nicht-None-Wert beibehalten. Die neue Tabelle würde am Ende aussehen wie folgt aus:

ID Date Risk 
1743333 12/1/2017 Low 
1743333 12/2/2017 Low 
1743333 12/3/2017 Low 
1743333 12/4/2017 Low 
1743333 12/5/2017 Medium 
1743333 12/6/2017 High 
1265464 12/1/2017 High 
1265464 12/2/2017 High 
1265464 12/3/2017 High 
1265464 12/4/2017 High 
1265464 12/5/2017 Medium 
1265464 12/6/2017 High 

Ich bin nicht mit ihm vertraut, aber ich dachte an mit Variablenzuweisungen durch die Reihen laufen. Ich verwende MySQL und versuche, dies in eine case-Anweisung zu implementieren, damit ich das Ergebnis einem neuen Feld in meiner vorhandenen Tabelle zuweisen kann. Probleme mit der Referenzierung oder der Verknüpfung mit der gleichen Tabelle in MySQL. Vielen Dank im Voraus und Entschuldigung für die lange Post!

+0

Zeigen Sie uns einen Code. Wir sind hier, um Ihnen zu helfen, schlechten Code zu reparieren, Sie nicht Code machen – Forbs

+0

'case Ausdrücke' arbeiten nur auf der aktuellen Zeile, nicht über Zeilen (nb sie sind nicht" case-Anweisungen ") –

Antwort

0

Ein Self-Join mit einer Datumsdifferenz kann wie folgt erreicht werden. Sie werden jedoch feststellen, dass im Ergebnis immer noch keine Ergebnisse angezeigt werden.

SQL Fiddle

MySQL 5.6 Schema Einrichtung:

CREATE TABLE Table1 
    (`ID` int, `Date` datetime, `Risk` varchar(6)) 
; 

INSERT INTO Table1 
    (`ID`, `Date`, `Risk`) 
VALUES 
    (1743333, '2017-12-01 00:00:00', 'Low'), 
    (1743333, '2017-12-02 00:00:00', 'Low'), 
    (1743333, '2017-12-03 00:00:00', 'None'), 
    (1743333, '2017-12-04 00:00:00', 'None'), 
    (1743333, '2017-12-05 00:00:00', 'Medium'), 
    (1743333, '2017-12-06 00:00:00', 'High'), 
    (1265464, '2017-12-01 00:00:00', 'High'), 
    (1265464, '2017-12-02 00:00:00', 'None'), 
    (1265464, '2017-12-03 00:00:00', 'None'), 
    (1265464, '2017-12-04 00:00:00', 'None'), 
    (1265464, '2017-12-05 00:00:00', 'High'), 
    (1265464, '2017-12-06 00:00:00', 'High') 
; 

Abfrage 1:

select 
     t.*, prev.risk as prev_risk 
from table1 as t 
inner join table1 as prev on t.id = prev.id and t.date = prev.date + interval 1 day 
where t.risk = 'none' 

Results:

|  ID |     Date | Risk | prev_risk | 
|---------|----------------------|------|-----------| 
| 1743333 | 2017-12-03T00:00:00Z | None |  Low | 
| 1743333 | 2017-12-04T00:00:00Z | None |  None | 
| 1265464 | 2017-12-02T00:00:00Z | None |  High | 
| 1265464 | 2017-12-03T00:00:00Z | None |  None | 
| 1265464 | 2017-12-04T00:00:00Z | None |  None | 
Verwandte Themen