我有这样的表:
id col1 col2
1 a 55
2 b 77
结果我想看到:
id col1 col2 MIN(col2)
1 a 55 55
2 b 77
类似的东西,或者在其他情况下,我如何获得整个表格的一个最小值。
您可以将 a与子查询一起使用,该子查询将为整个表CROSS JOIN
选择值:min(col2)
select t1.id,
t1.col1,
t1.col2,
t2.minCol2
from yourtable t1
cross join
(
select min(col2) minCol2
from yourtable
) t2
如果要将其扩展为仅显示min(col2)
第一行的值,则可以使用用户定义的变量:
select id,
col1,
col2,
case when rn = 1 then mincol2 else '' end mincol2
from
(
select t1.id,
t1.col1,
t1.col2,
t2.minCol2,
@row:=case when @prev:=t1.id then @row else 0 end +1 rn,
@prev:=t1.id
from yourtable t1
cross join
(
select min(col2) minCol2
from yourtable
) t2
cross join (select @row:=0, @prev:=null) r
order by t1.id
) d
order by id
如果您有多个要比较的列,则可以使用查询取消透视UNION ALL
数据,然后选择min
结果的值:
select t1.id,
t1.col1,
t1.col2,
t2.MinCol
from yourtable t1
cross join
(
select min(col) MinCol
from
(
select col2 col
from yourtable
union all
select col3
from yourtable
) src
) t2
你不能。列数是固定的,因此您可以获得@bluefeet 描述的所有行的最小值。
您可以使用以下逻辑在较少的行数(通常为 1)上获取它:
(case when t2.minCol2 = t1.col2 then t2.minCol2 end)
但这会将 NULL 放在其他行上。