根据另一个字段中的日期将 table 字段设置为零
Set a table field to zero based on a date in another field
我有一个 table 列 Date
和 Amount
:
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
我有一个 table 列 Date
和 Amount
:
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