【问题标题】:selecting minimum of multiple columns选择最少的多列
【发布时间】:2012-10-08 12:54:46
【问题描述】:

我有三个名为 list1、list2、list3 的十进制列。 我想在单个查询中找到三个中的最小值。
我已经厌倦了:

SELECT Least(list1, list2, list3) 
FROM   table1 

它会抛出一个错误,least 是无法识别的函数。

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

尝试使用UNION

SELECT MIN(x.a)
FROM
    (
        SELECT list1 a FROM table1
        UNION
        SELECT list2 a FROM table1
        UNION
        SELECT list3 a FROM table1
    ) x

更新 1

SELECT ID,MIN(x.a)
FROM
    (
        SELECT ID,list1 a FROM table1
        UNION
        SELECT ID,list2 a FROM table1
        UNION
        SELECT ID,list3 a FROM table1
    ) x
GROUP BY ID

SQLFiddle Demo

【讨论】:

  • 我有一个疑问,至少是sql的函数吧,那为什么说它不是内置函数
  • 不,不是所有像你这样的RDBMS都支持LEAST函数。
  • @Maddy 在说什么?
  • 我在这里必须支持@Maddy,不应该对整个表格进行至少 3 列的处理,而不是按照描述问题的方式。最少应该只影响每一行。我不明白这如何解决问题。
  • 这将在表具有主键或唯一 ID 的情况下工作。看看 Maddy 和我的脚本,它们不依赖主键,比你的脚本稍微快一点。
【解决方案2】:

其他解决方案,

case when col1 < col2 
     then case when col1 < col3 
               then col1
               else col3 end
     else case when col2 < col3
               then col2
               else col3 end;

【讨论】:

  • 这适用于 3 列,但超过 3 列会变得复杂。但是我同意这是一个快速的解决方案
  • @t-clausen.dk,您在写,当comarison 有更多列时,这可能不是最好的方法
【解决方案3】:

如果表格中有超过 1 行,这将起作用

select c.mlist from table1 a
cross apply
(
select min(list1) mlist from
  (
    select list1
    union all
    select list2
    union all
    select list3
  ) b
) c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2014-04-18
    相关资源
    最近更新 更多