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)