从表中列的最大值和最小值
问题描述:
我有一个表格中有以下数据,我试图从表格中获取最大值和最小值列。如果它是一列,我可以使用列的最大/最小值,但在这里我是比较表中的所有列。我需要的是添加新列以存储最大和最小数据。从表中列的最大值和最小值
而且将只有一个行的表提前
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
感谢。
答
最简单的方法就是交叉应用列的最小值/最大值。例如对于:
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);
答
使用VALUES方法unpivot的数据,然后reaggravating它将使一个更清晰的语法,但它确实会带来成本的性能(不可怕,但它的存在)。使用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
答
我发现这个解决方案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
您可以取消转换序列(https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx),然后取最大值/最小值 – Jeremy