2015-03-19 69 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 
相關問題