0

単一のステートメントで実行したい更新ステートメントがありますが、少し難しいと感じています。

テーブルは、時間の経過に伴うターゲットの変化を記録します。

たとえば、1 月 1 日から 31 日までは 100、2 月 1 日から 28 日までは 110、3 月 1 日から 31 日までは 120 などとなります。

ユーザーは amount と date_from のみを入力します。すべてのレコードの date_to は、レコードが削除、更新、または新しいレコードが挿入されるたびに再計算されます。取得する値は、現在のレコードの day_from よりも大きい最小 day_from を持つレコードの day_from の前日です。もう少し明確にする方法が思いつかないので、いくつかの例を次に示します。

From            To            Amount
1st Jan         31st Jan      100
1st Feb         28th Feb      110
1st Mar         31st Mar      120
...
...

date_from 15th of Jan で value = 105 のレコードを挿入すると、1 月 1 日のレコードの date_to が 1 月 14 日に更新され、挿入されたレコードの date_to が 1 月 31 日に更新されます。

2 月 1 日のレコードを削除すると、新しく挿入されたレコードの新しいレコードの date_to が 1 月 31 日から 3 月 28 日に変更されます。

私がやろうとしていることを十分に明確に説明してくれることを願っています。

さて、ここに私のSQLがありますが、うまくいきません

以下が返されます。

エラー コード: 1093。FROM 句で更新対象のテーブル 'ptcth1' を指定することはできません

update personal_trainer_client_target_history ptcth1 set date_to = 
(
    select min(date_from) from personal_trainer_client_target_history ptcth2 
    where ptcth2.date_from > ptcth1.date_from
)

このように修正しようとすると、=> Error Code: 1054. Unknown column 'ptcth1.date_from' in 'where clause' が表示されます

update personal_trainer_client_target_history ptcth1 set date_to = 
(
  select date_from from 
  (
    select min(date_from) from personal_trainer_client_target_history ptcth2 
    where ptcth2.date_from > ptcth1.date_from
  ) 
  as temp_table
)

何か案が?

4

1 に答える 1

1
    DROP TABLE IF EXISTS my_table;

    CREATE TABLE my_table (from_date DATE NOT NULL PRIMARY KEY,Amount INT NOT NULL);

    INSERT INTO my_table VALUES 
    ('2013-01-01',100),
    ('2013-02-01',110),
    ('2013-03-01',120);

    SELECT x.from_date
         , MIN(y.from_date) - INTERVAL 1 DAY to_date 
         , x.amount
      FROM my_table x 
      LEFT 
      JOIN my_table y 
        ON y.from_date > x.from_date 
     GROUP 
        BY x.from_date;
    +------------+------------+--------+
    | from_date  | to_date    | amount |
    +------------+------------+--------+
    | 2013-01-01 | 2013-01-31 |    100 |
    | 2013-02-01 | 2013-02-28 |    110 |    
    | 2013-03-01 | NULL       |    120 |
    +------------+------------+--------+

    INSERT INTO my_table VALUES ('2013-01-15',105);

    SELECT x.from_date
         , MIN(y.from_date) - INTERVAL 1 DAY to_date 
         , x.amount
      FROM my_table x 
      LEFT 
      JOIN my_table y 
        ON y.from_date > x.from_date 
     GROUP 
        BY x.from_date;
    +------------+------------+--------+
    | from_date  | to_date    | amount |
    +------------+------------+--------+
    | 2013-01-01 | 2013-01-14 |    100 |
    | 2013-01-15 | 2013-01-31 |    105 |
    | 2013-02-01 | 2013-02-28 |    110 |
    | 2013-03-01 | NULL       |    120 |
    +------------+------------+--------+
于 2013-01-07T15:39:54.920 に答える