0

我的桌子看起来像

产品 ID 状态行 N0 startDate ENDdate
1 订购 3 1999 年 1 月 2 日 NULL
1 租用 1 02/04/2006 NULL
1 转租 4 2000 年 12 月 31 日 NULL
1 取消 9 2003 年 10 月 25 日 NULL
2 交付 5 1999 年 1 月 2 日 NULL
2 丢失 3 02/04/2001 空
2 取消 4 2000 年 12 月 31 日 NULL

我需要写一个更新语句,如果状态被取消,产品结束日期是 max(linenumber) 的 StartDate

结果应该看起来像

ProductId     EndDate
1             10/25/2003  Date of line number(9)
2             01/02/1999  Date of line number(5)

谢谢

4

1 回答 1

1

Cancelled一行的产品由以下给出:

select distinct productid from tbl where status='Cancelled'

这些的最大行号是:

select productid,max(lineno) n from tbl
where productid in (select distinct productid from tbl where status='Cancelled')
group by productid

对应startdate的由下式给出:

select a.productid pid,b.n,a.startdate d from tbl a
join (
  select productid,max(lineno) n from tbl
  where productid in (
    select distinct productid from tbl 
    where status='Cancelled'
    )
  group by productid
  )b on (a.productid=b.productid and a.lineno=b.n)

最后,要tbl根据此更新,您应该:

update tbl set enddate=d
from (
  select a.productid pid,b.n,a.startdate d from tbl a
  join (
    select productid,max(lineno) n from tbl
    where productid in (
      select distinct productid from tbl 
      where status='Cancelled'
      )
    group by productid
    )b on (a.productid=b.productid and a.lineno=b.n)
 ) t
where productid=t.pid

如果您只需要相关lineno更新的行,请添加and lineno=t.nwhere子句中。

于 2013-10-22T14:06:25.923 回答