根据另一个字段中的日期将 table 字段设置为零

Set a table field to zero based on a date in another field

我有一个 table 列 DateAmount:

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

Date 在某个日期之后时,我想将 Amount 设置为零。更新后应该如下所示:

CustID    Date        Amount
1         20150301    10000
1         20150302    0
1         20150303    0
2         20150208    0
2         20150201    5000
2         20150202    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

我会使用 window 函数来做到这一点:

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

我们可以进行更新,但这里我在 select 语句中显示了相同的 row_number 和 MIN 函数...

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

;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