我正在寻找一种从表格中的单行中选择最高和最低值(整数)的方法。有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
你能帮助我吗?谢谢!
答案 0 :(得分:3)
您可以使用CROSS APPLY
和VALUES
子句执行此操作。使用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