我有这个表,现在我需要对amt列执行除法并更新数据int CalcAmt
WATCHER_PORT=9998
DURATION= $(ffprobe -select_streams v:0 -show_entries "stream=duration" \
-of compact $INPUT_FILE | sed 's!.*=\(.*\)!\1!g')
nc -l $WATCHER_PORT | while read; do
sed -n 's/out_time=\(.*\)/\1 of $DURATION/p')
done &
ffmpeg -y -i $INPUT_FILE -progress localhost:$WATCHER_PORT $OUTPUT_ARGS
例如:(FEB / JAN)然后将输出存储在2月份的CalcAmt中, (MAR / FEB)然后将输出存储在MAR的CalcAmt中,
预期产出:
month amt CalcAmt
JAN 10000 NULL
FEB 20000 NULL
MAR 30000 NULL
APR 40000 NULL
答案 0 :(得分:0)
这可以通过LEAD/LAG
轻松完成,因为您使用Sql Server 2008
,因此无法使用LEAD/LAG
功能。相反,使用可以为每一行生成行号,并自行连接相同的表,行号+ 1以获取前一行数据。
注意:如果您有,请在months
语句中按顺序添加剩余的case
。
作为旁注,您不应将 reserved keywords 用作对象名称 ex: MONTH
;WITH cte
AS (SELECT Rn=CASE [month]
WHEN 'Jan' THEN 1
WHEN 'feb' THEN 2
WHEN 'mar' THEN 3
ELSE 4
END,
*
FROM YOURTABLE)
SELECT A.month,
A.amt,
CalcAmt = A.amt / NULLIF(b.amt ,0)
FROM cte A
LEFT OUTER JOIN cte B
ON A.rn = b.rn + 1
如果您想更新表格,请使用此页。
;WITH cte
AS (SELECT Rn=CASE [month]
WHEN 'Jan' THEN 1
WHEN 'feb' THEN 2
WHEN 'mar' THEN 3
ELSE 4
END,
*
FROM YOURTABLE)
UPDATE C
SET C.calcamt = D.calcamt
FROM cte C
INNER JOIN (SELECT A.month,
A.amt,
calcamt=A.amt / b.amt
FROM cte A
LEFT OUTER JOIN cte B
ON A.rn = b.rn + 1) D
ON C.[month] = D.[month]