在sql中row1 by row,row2 by row3 .... 。并存储输出第三列

时间:2015-07-11 05:07:39

标签: sql sql-server sql-server-2008

我有这个表,现在我需要对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

1 个答案:

答案 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]