2017-12-15 19 views
0

IDが重複していないテーブルがあります。日付フィールドと「なし」、「低」、「中」、「高」などの値を持つフィールドタイトルRISKがあります。それは次のようになります。case文を使用して別の行の値を割り当てるにはどうすればよいですか?

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 

RISKフィールドは、私が持っているか、それのための基準がある正確に把握していない他のデータポイントとコードでの計算によって構築されています。 「なし」の値は、計算基準に基づいてLow、MedまたはHighを割り当てるための十分な情報がない場合に、本質的に割り当てられます。私がしようとしているのは、RISK = 'None'の値がある場合、前の行のRISK値をその特定のIDの前の日付(1日前)に基づいて割り当てたいと思います。したがって、任意の日に、リスクが「なし」以外のものであり、日数の進行として「なし」になる場合は、前回の最新の「なし」の値を維持したいと思います。新しいテーブルはこのように見て終わるでしょう:

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 

私はそれに慣れていないが、私は変数の代入と行を反復処理を考えていました。私はMySQLを使用しており、これをケースステートメントに実装しようとしているので、結果を既存のテーブルの新しいフィールドに割り当てることができます。 MySQLの同じテーブルへの参照または参加に問題が発生しました。長年の投稿に感謝して申し訳ありません!次のように

+0

私たちにいくつかのコードを見せてください。 – Forbs

+0

'case expressions'は行全体ではなく現在の行でのみ動作します(nbは" case文 "ではありません)。 –

答えて

0

日付の差を用いて自己結合を達成することができます。ただし、結果に「なし」が表示されることに注意してください。

SQL Fiddle

のMySQL 5.6スキーマのセットアップ

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

クエリ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 | 
関連する問題