2017-07-27 43 views
2

我試圖使用group by子句更新基於列的dt列'last'。我需要找到最後日期爲集團組由HID,TID tdate,FID,確實,DEPID,ACC'和這個組中的所有記錄中設置'DT'值。MySQL基於最大日期和組更新列中的所有值

例如:

|  id | hid | tid |  tdate | fid | did | p2 | depid | acc | dt |     last | 
|----------|-------|-----|------------|-----|-----|-------|-------|------|------|----------------------| 
| 3742030 | 12332 | 1 | 2017-09-02 | 1 | 1 | 9560 |  1 | 5334 | 1 | 2016-11-03T09:00:20Z | 
| 3799297 | 2386 | 1 | 2017-08-29 | 1 | 1 | 8480 |  1 | 5352 | 1 | 2016-11-03T11:12:55Z | 
| 4848877 | 2386 | 1 | 2017-08-29 | 1 | 1 | 8720 |  1 | 5352 | 2369 | 2016-12-17T16:59:22Z | 
| 10706343 | 12332 | 1 | 2017-09-02 | 1 | 1 | 9660 |  1 | 5334 | 2065 | 2017-03-01T12:32:27Z | 
| 14546682 | 2386 | 1 | 2017-08-29 | 1 | 1 | 11720 |  1 | 5352 | 4431 | 2017-05-12T10:24:09Z | 
| 15824920 | 12332 | 1 | 2017-09-02 | 1 | 1 | 10820 |  1 | 5334 | 1111 | 2017-07-15T05:19:04Z | 

|  id | hid | tid |  tdate | fid | did | p2 | depid | acc | dt |     last | 
|----------|-------|-----|------------|-----|-----|-------|-------|------|------|----------------------| 
| 3742030 | 12332 | 1 | 2017-09-02 | 1 | 1 | 9560 |  1 | 5334 | 1111 | 2016-11-03T09:00:20Z | 
| 3799297 | 2386 | 1 | 2017-08-29 | 1 | 1 | 8480 |  1 | 5352 | 4431 | 2016-11-03T11:12:55Z | 
| 4848877 | 2386 | 1 | 2017-08-29 | 1 | 1 | 8720 |  1 | 5352 | 4431 | 2016-12-17T16:59:22Z | 
| 10706343 | 12332 | 1 | 2017-09-02 | 1 | 1 | 9660 |  1 | 5334 | 1111 | 2017-03-01T12:32:27Z | 
| 14546682 | 2386 | 1 | 2017-08-29 | 1 | 1 | 11720 |  1 | 5352 | 4431 | 2017-05-12T10:24:09Z | 
| 15824920 | 12332 | 1 | 2017-09-02 | 1 | 1 | 10820 |  1 | 5334 | 1111 | 2017-07-15T05:19:04Z | 

模式: http://sqlfiddle.com/#!9/4fad1d/1

是否有某種方式來更新基於組的表中的所有行?

感謝

+1

只是一個想法...也許你可以很有效地說明問題一半的列數,但爲小提琴+1和預期的結果 – Strawberry

回答

1

加入表,將發現每個組最近的排子查詢。

update of t 
join (
    select t1.* 
    from of t1 
    join (
    select hid,tid,tdate,fid,did,depid,acc, max(last) as last 
    from of 
    group by hid,tid,tdate,fid,did,depid,acc 
) t2 using (hid,tid,tdate,fid,did,depid,acc,last) 
) t3 using (hid,tid,tdate,fid,did,depid,acc) 
set t.dt = t3.dt; 

http://sqlfiddle.com/#!9/93708/2

對於子查詢的連接,您還可以使用NATURAL JOIN

natural join (
    select hid,tid,tdate,fid,did,depid,acc, max(last) as last 
    from of 
    group by hid,tid,tdate,fid,did,depid,acc 
) t2 

http://sqlfiddle.com/#!9/e7e5ee/1

+0

這麼多年,我不知道'USING' syn稅。 – Peter

+0

@Peter在ON子句中保存22行代碼:-) –

+0

謝謝你的幫助。這是我需要的。 – awiamo