Here's a sample of it as a CTE - note the ; before it. You will need that if this is part of a procedure that does other things.
;
WITH get_stddev AS
( SELECT a.idnumber ,
a.marketdate ,
STDEV(b.OHdiff) stddev_oh ,
STDEV(b.OLdiff) stddev_ol
FROM myTable b
JOIN myTable a
ON
(
b.IDNumber = a.IDNumber
AND b.MarketDate < a.MarketDate
AND b.MarketDate > a.MarketDate-31
)
WHERE a.MarketDate BETWEEN @lastUpdate + .1 AND @updateThrough
AND a.IDNumber BETWEEN @minIDNumber AND @maxIDNumber
GROUP BY a.idnumber,
a.marketdate
) ----- end cte
UPDATE c
SET StDev_OH_30Day = stddev_oh ,
StDev_OL_30Day = stddev_ol
FROM mytable c
JOIN get_stddev gs
ON
(
gs.IDNumber = c.IDNumber
AND c.marketdate = gs.marketdate )
I urge you to test this thoroughly. I wasn't completely sure of your data set-up. It's possible this needs some changes for your tables.