返回sql server 2012中最大值的列名

时间:2015-02-14 06:22:11

标签: sql stored-procedures sql-server-2012 dynamic-sql

我的表看起来像这样(完全不同的名字)

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 ...) 

1 个答案:

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