2017-01-28 21 views
0

代码:更新列与第二最高数字在SQL

update [MemberBackup].[dbo].[uid3times$] 
set rc2tobedeleted = 
case when rc1 > rc2 and rc1 > rc3 and rc2 < rc3 then rc2 
when rc2 > rc3 and rc2 > rc1 and rc1 < rc3 then rc1 
when rc3 > rc1 and rc3 > rc2 and rc1 < rc2 then rc1 
else 0 end 

我有3列RC1,RC2,RC3和号码3列是随机我想更新/设置在第二次数最多rc2tobedeleted

但我的代码来到其他地方,因为我认为我已经照顾了3种可能的情况。

我在做什么错了?

回答

2

Giorgos答案是伟大的,但它可以简化像这样Sql server 2012及以上

UPDATE [MemberBackup].[dbo].[uid3times$] 
SET rc2tobedeleted = (SELECT rc 
         FROM (VALUES (rc1),(rc2),(rc3)) tc (rc) 
         ORDER BY rc DESC 
         OFFSET 1 ROWS FETCH next 1 rows only) 

旧版本下面是使用这个

UPDATE [MemberBackup].[dbo].[uid3times$] 
SET rc2tobedeleted = (SELECT rc 
         FROM (SELECT Row_number()OVER(ORDER BY rc DESC) rn,rc 
           FROM (VALUES (rc1),(rc2),(rc3)) tc (rc)) a 
         WHERE rn = 2) 

理念,unpivoting的三列到单个列并在未转义的行上生成行号并更新具有行号的记录2

Ano这种方法的好处是甚至你有三个以上的三列,你想找到第n个记录,那么它比笨拙更容易和优雅CASE陈述

+0

如果他们是4值而不是3呢? –

+0

@ArijitMukherjee - 简单的将第四列添加到表值构造函数。像这样((VALUES(rc1),(rc2),(rc3),(rc4))' –

+0

,如果我想要第三高,那么rn = 3或偏移2正确? –

4

试试这个:

;WITH ToUpdate AS (
    SELECT rc2tobedeleted, t.v AS val 
    FROM [MemberBackup].[dbo].[uid3times$] 
    CROSS APPLY (
     SELECT x.v 
     FROM (VALUES (rc1), (rc2), (rc3)) AS x(v) 
     ORDER BY x.v DESC 
     OFFSET 1 ROWS 
     FETCH NEXT 1 ROWS ONLY) AS t 
UPDATE ToUpdate 
SET rc2tobedeleted = val 

我觉得上面的查询在比较更清洁和易于理解的结构,多一个CASE表达WHEN条款。

查询使用VALUES表值构造函数以构建一个由字段值rc1, rc2, rc3组成的内联表。使用从SQL Server 2012开始提供的OFFSET FETCH子句,我们可以获得第二高的值。

最后,使用CTE执行UPDATE操作:将更新从CTE传播到存储在数据库中的实际表的底层行。

+1

非常优雅! +1! – Mureinik

+0

如果它们是4值而不是3呢? –