SQL:从一行中选择最高和最低值(int)

时间:2016-11-29 14:03:08

标签: sql sql-server

我正在寻找一种从表格中的单行中选择最高和最低值(整数)的方法。有4列我需要比较在一起,得到最高和最低的数字。

表格看起来像这样...

id | name | col_to_compare1 | col_to_compare2 | col_to_compare3 | col_to_compare4

1 | John | 5 | 5 | 2 | 1

2 | Peter | 3 | 2 | 4 | 1

3 | Josh | 3 | 5 | 1 | 3
你能帮助我吗?谢谢!

5 个答案:

答案 0 :(得分:3)

您可以使用CROSS APPLYVALUES子句执行此操作。使用VALUES对所有比较列进行分组,然后选择最大值

SELECT 
        MAX(d.data1) as MaxOfColumns
        ,MIN(d.data1) as MinOfColumns
        ,a.id
        ,a.name
  FROM YOURTABLE as a 
  CROSS APPLY   (    
                VALUES(a.col_to_compare1)
                     ,(a.col_to_compare2)
                     ,(a. col_to_compare3)
                     ,(a.col_to_compare4)
                     ,(a. col_to_compare5)
                ) as d(data1) --Name the Column
   GROUP BY a.id
            ,a.name

答案 1 :(得分:1)

假设您正在寻找每行最小/最大

Declare @YourTable table (id int,name varchar(50),col_to_compare1 int,col_to_compare2 int,col_to_compare3 int,col_to_compare4 int)
Insert Into @YourTable values
(1,'John',5,5,2,1),
(2,'Peter',3,2,4,1),
(3,'Josh',3,5,1,3)

Select A.ID
      ,A.Name
      ,MinVal = min(B.N)
      ,MaxVal = max(B.N)
 From  @YourTable A
 Cross Apply (Select N From (values(a.col_to_compare1),(a.col_to_compare2),(a.col_to_compare3),(a.col_to_compare4)) N(N) ) B
 Group By A.ID,A.Name

返回

ID  Name    MinVal  MaxVal
1   John    1       5
3   Josh    1       5
2   Peter   1       4

答案 2 :(得分:0)

这样做的一种方法是"打破"除了数据

declare @table table (id int, name varchar(10), col1 int, col2 int, col3 int, col4 int)

insert into @table values (1 , 'John' , 5 , 5 , 2 , 1)
insert into @table values (2 , 'Peter' , 3 , 2 , 4 , 1)
insert into @table values (3 , 'Josh' , 3 , 5 , 1 , 3)


;with stretch as
(
    select id, col1 as col from @table
    union all
    select id, col2 as col from @table
    union all
    select id, col3 as col from @table
    union all
    select id, col4 as col from @table
)

select
    t.id, 
    t.name, 
    agg.MinCol, 
    agg.MaxCol
from @table t
    inner join 
    (
        select
            id, min(col) as MinCol, max(col) as MaxCol
        from stretch
        group by id
    ) agg
        on t.id = agg.id

答案 3 :(得分:0)

这些解决方案保留当前行并添加其他最小/最大列

MyComponent

OR

select      *

from        t cross apply   

           (select  min(col)   as min_col
                   ,max(col)   as max_col

            from    (
                        values

                        (t.col_to_compare1)
                       ,(t.col_to_compare2)
                       ,(t.col_to_compare3)    
                       ,(t.col_to_compare4)

                    ) c(col)
            ) c 
select      *
           ,cast ('' as xml).value ('min ((sql:column("t.col_to_compare1"),sql:column("t.col_to_compare2"),sql:column("t.col_to_compare3"),sql:column("t.col_to_compare4")))','int')    as min_col
           ,cast ('' as xml).value ('max ((sql:column("t.col_to_compare1"),sql:column("t.col_to_compare2"),sql:column("t.col_to_compare3"),sql:column("t.col_to_compare4")))','int')    as max_col

from        t   

答案 4 :(得分:0)

似乎很简单

SELECT min(col1), max(col1), min(col2), max(col2), min(col3), max(col3), min(col4), max(col4) FROM table

为每列提供最小值和最大值。

根据OP的评论,我相信他可能正在寻找被被查询的人分组的最小/最大值。

那就是:

SELECT name, min(col1), max(col1), min(col2), max(col2), min(col3), max(col3), min(col4), max(col4) FROM table GROUP BY name
相关问题