0

我有这样的表:

id col1 col2
1   a    55
2   b    77

结果我想看到:

id col1 col2 MIN(col2)
1   a    55   55
2   b    77

类似的东西,或者在其他情况下,我如何获得整个表格的一个最小值。

4

2 回答 2

1

您可以将 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

请参阅SQL Fiddle with Demo

如果要将其扩展为仅显示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

请参阅带有演示的 SQL Fiddle

如果您有多个要比较的列,则可以使用查询取消透视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

请参阅带有演示的 SQL Fiddle

于 2013-02-19T21:51:07.737 回答
1

你不能。列数是固定的,因此您可以获得@bluefeet 描述的所有行的最小值。

您可以使用以下逻辑在较少的行数(通常为 1)上获取它:

(case when t2.minCol2 = t1.col2 then t2.minCol2 end)

但这会将 NULL 放在其他行上。

于 2013-02-19T21:54:45.750 回答