【问题标题】:Max and min from the column in a table表中列的最大值和最小值
【发布时间】:2018-03-05 21:07:29
【问题描述】:

我有一个包含以下数据的表,我正在尝试从表中获取最大和最小列。如果它是一列,我可以使用最大/最小列,但在这里我比较表中的所有列。我需要的是添加新列来存储最大和最小数据。

表格中只有一行

create  table 
#test ( column1 int, column2 int , column3 int , column4 int ,column5 int,column6 int)

insert into #test
values( 89, 103,87,67,86,56)

select * from #test 

--drop table #test

提前致谢。

【问题讨论】:

标签: sql-server tsql sql-server-2012 ssms


【解决方案1】:

最简单的方法是交叉应用列的最小值/最大值。例如:

SELECT * 
FROM #test t 
CROSS APPLY (
    SELECT MAX(val), MIN(val) 
    FROM (VALUES (t.column1), (t.column2), (t.column3), (t.column4), (t.column5), (t.column6)) AS c(val)
) AS c(maxvalue, minvalue);

【讨论】:

    【解决方案2】:

    使用 VALUES 方法对数据进行反透视,然后对其进行重新放大,这将使语法更简洁,但它确实会带来性能成本(并不可怕,但确实存在)。使用 CASE 表达式有点麻烦,但在语法部门,特别是如果有很多列要评估,但你不会招致同样的性能损失......

    SELECT
        t.column1, t.column2, t.column3, t.column4, t.column5, t.column6,
        MinValue = CASE 
                        WHEN t.column1 <= t.column2 AND t.column1 <= t.column3 AND t.column1 <= t.column4 AND t.column1 <= t.column5 AND t.column1 <= t.column6 THEN t.column1
                        WHEN t.column2 <= t.column1 AND t.column2 <= t.column3 AND t.column2 <= t.column4 AND t.column2 <= t.column5 AND t.column2 <= t.column6 THEN t.column2
                        WHEN t.column3 <= t.column1 AND t.column3 <= t.column2 AND t.column3 <= t.column4 AND t.column3 <= t.column5 AND t.column3 <= t.column6 THEN t.column3
                        WHEN t.column4 <= t.column1 AND t.column4 <= t.column2 AND t.column4 <= t.column3 AND t.column4 <= t.column5 AND t.column4 <= t.column6 THEN t.column4
                        WHEN t.column5 <= t.column1 AND t.column5 <= t.column2 AND t.column5 <= t.column3 AND t.column5 <= t.column4 AND t.column5 <= t.column6 THEN t.column5
                        ELSE t.column6
                    END,
        MaxValue = CASE 
                        WHEN t.column1 >= t.column2 AND t.column1 >= t.column3 AND t.column1 >= t.column4 AND t.column1 >= t.column5 AND t.column1 >= t.column6 THEN t.column1
                        WHEN t.column2 >= t.column1 AND t.column2 >= t.column3 AND t.column2 >= t.column4 AND t.column2 >= t.column5 AND t.column2 >= t.column6 THEN t.column2
                        WHEN t.column3 >= t.column1 AND t.column3 >= t.column2 AND t.column3 >= t.column4 AND t.column3 >= t.column5 AND t.column3 >= t.column6 THEN t.column3
                        WHEN t.column4 >= t.column1 AND t.column4 >= t.column2 AND t.column4 >= t.column3 AND t.column4 >= t.column5 AND t.column4 >= t.column6 THEN t.column4
                        WHEN t.column5 >= t.column1 AND t.column5 >= t.column2 AND t.column5 >= t.column3 AND t.column5 >= t.column4 AND t.column5 >= t.column6 THEN t.column5
                        ELSE t.column6
                    END
    FROM
        #test t;
    

    结果...

    column1     column2     column3     column4     column5     column6     MinValue    MaxValue
    ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    89          103         87          67          86          56          56          103
    

    【讨论】:

      【解决方案3】:

      我找到了这个解决方案here

      SELECT
          column1
          ,column2
          ,column3
          ,column4
          ,column5
          ,column6
         ,(SELECT MAX(MaxValue)
            FROM (VALUES (column1),(column2),(column3), (column4), (column5), (column6)) AS [Values](MaxValue)) 
         AS MaxValue
         ,(SELECT MIN(MinValue)
            FROM (VALUES (column1),(column2),(column3), (column4), (column5), (column6)) AS [Values](MinValue)) 
         AS MinValue
      FROM #test
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2015-01-16
        相关资源
        最近更新 更多