2015-03-19 64 views
0

我有列DateAmount表:设置表字段为零基于日期在另一场

CustID Date  Amount 
1   20150301 10000 
1   20150302 5000 
1   20150303 15000 
2   20150208 9000 
2   20150201 5000 
2   20150202 6000 

我想设置Amount为零时Date是一个特定日期之后。更新后应该看起来如下:

CustID Date  Amount 
1   20150301 10000 
1   20150302 0 
1   20150303 0 
2   20150208 0 
2   20150201 5000 
2   20150202 0 

我该怎么做?

回答

2

我会做到这一点使用窗口函数:

with toupdate as (
     select t.*, min(date) over (partition by CustId) as mindate 
     from table t 
    ) 
update toupdate 
    set amount = 0 
    where date > mindate; 
0

您可以使用下面的查询,检查是否date不等于MIN(Date)

UPDATE Mytable 
SET Amount = 0 
FROM Mytable AS t 
WHERE [date] <> (SELECT MIN([Date]) 
       FROM Mytable 
       WHERE CustId = t.CustID) 

,或者使用CTE

;WITH MIN_CTE AS (
    SELECT MIN([Date]) AS MinDate, CustID 
    FROM Mytable 
    GROUP BY CustID 
) 
UPDATE Mytable 
SET Amount = 0 
FROM Mytable AS t 
INNER JOIN MIN_CTE AS c ON t.CustID = c.CustID 
WHERE t.[Date] <> c.MinDate 
+1

您可以从第一个的子选择删除GROUP BY。 – jarlh 2015-03-19 12:34:00

+0

@jarlh是的,当然,谢谢。我已经相应更新了。 – 2015-03-19 12:36:44

0

我们可以做updat Ë但与ROW_NUMBER和MIN功能也select语句我在这里展示一样...

declare @t table (custid int,datet date,Amount int) 
insert into @t(custid,datet,Amount)values (1,'20150301',10000) 
insert into @t(custid,datet,Amount)values (1,'20150302',5000) 
insert into @t(custid,datet,Amount)values (1,'20150303',15000) 
insert into @t(custid,datet,Amount)values (2,'20150208',9000) 
insert into @t(custid,datet,Amount)values (2,'20150201',5000) 
insert into @t(custid,datet,Amount)values (2,'20150202',4000) 

;with CTE AS 
(
select *,ROW_NUMBER()OVER(PARTITION BY custid order by datet)RN from @t 
) 
Select custid,datet,case when RN = 1 then amount ELSE 0 END Amt from cte 

OR

;with CTE AS 
(
select *,min(datet)OVER(PARTITION BY custid)RN from @t 
) 
Select custid,datet,case when RN = MIN(datet) then amount ELSE 0 END Amt from cte 
group by custid,datet,Amount,RN 
相关问题