return sql 服务器 2012 中最大值的列名
return column name of the maximum value in sql server 2012
我的table看起来像这样(完全不同的名字)
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 ...)
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
)
我真的不喜欢依赖 top 但这不是一个标准的 sql 问题。除了按字母顺序返回第一列名称外,它对关系没有任何作用。
您可以通过以下条件使用修改来获得 "third maximum"。 (显然常量 2 来自 3 - 1。)您的 SQL Server 版本也允许您在那里使用变量。我认为 SQL 2012 也支持 limit
语法,如果 top
更可取的话。由于它也适用于前 0 名和前 1 名,因此您可以 运行 循环中的此查询来填充所有 "maximums" 从第一个到第三个。
一旦开始建立关系,您最终会得到一个 "thirtieth maximum" 为空的关系。不过,请确保涵盖这些情况。
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)
我的table看起来像这样(完全不同的名字)
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 ...)
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
)
我真的不喜欢依赖 top 但这不是一个标准的 sql 问题。除了按字母顺序返回第一列名称外,它对关系没有任何作用。
您可以通过以下条件使用修改来获得 "third maximum"。 (显然常量 2 来自 3 - 1。)您的 SQL Server 版本也允许您在那里使用变量。我认为 SQL 2012 也支持 limit
语法,如果 top
更可取的话。由于它也适用于前 0 名和前 1 名,因此您可以 运行 循环中的此查询来填充所有 "maximums" 从第一个到第三个。
一旦开始建立关系,您最终会得到一个 "thirtieth maximum" 为空的关系。不过,请确保涵盖这些情况。
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)