我的表看起来像这样(完全不同的名字)
ID Column1--Column2---Column3--------------Column30
X 0 2 6 0101 31
我想找到Column1到Column30的第二个最大值,并将column_Name放在一个单独的列中。
第一行看起来像:
ID Column1--Column2---Column3--------------Column30------SecondMax
X 0 2 6 0101 31 Column3
查询:
Update Table
Set SecondMax= (select Column_Name from table where ...)
答案 0 :(得分:1)
with unpvt as (
select id, c, m
from T
unpivot (c for m in (c1, c2, c3, ..., c30)) as u /* <-- your list of columns */
)
update T
set SecondMax = (
select top 1 m
from unpvt as u1
where
u1.id = T.id
and u1.c < (
select max(c) from unpvt as u2 where u2.id = u1.id
)
order by c desc, m
)
我真的不喜欢依靠顶级但是这不是一个标准的SQL问题。除了按字母顺序排序第一列名称之外,它对关系没有任何作用。
您可以通过以下条件使用修改来获得&#34;第三个最大值&#34;。 (显然,常量2来自3 - 1.)您的SQL Server版本允许您在那里使用变量。我认为SQL 2012还支持limit
语法,如果它优于top
。因为它应该适用于前0和前1,你可能只能在循环中运行此查询以填充所有&#34;最大值&#34;从第一天到第三十天。
一旦你开始建立关系,你最终会得到一个最大的第三十个&#34;那是空的。请确保你覆盖这些案件。
and u1.c < all (
select top 2 distinct c from unpvt as u2 where u2.id = u1.id
)
在我考虑之后。如果您要对这么多列进行排名和更新,那么使用正确的排名函数并一次更新所有内容可能会更有意义。即使字母排序仍然是任意的,您也可以更好地处理关系。
with unpvt as (
select id, c, m, row_number() over (partition by id order by c desc, m) as nthmax
from T
unpivot (c for m in (c1, c2, c3, ..., c30)) as u /* <-- your list of columns */
)
update T set
FirstMax = (select c from unpvt as u where u.id = T.id and nth_max = 1),
SecondMax = (select c from unpvt as u where u.id = T.id and nth_max = 2),
...
NthMax = (select c from unpvt as u where u.id = T.id and nth_max = N)