SQL Выбор значения MIN из данных строки, а не данных столбца - PullRequest
2 голосов
/ 17 августа 2011

Используя SQL 2005, есть ли способ выбрать минимальное значение между 5 столбцами в одной строке данных?

Итак, если у меня есть ряд таких данных:

id    num1    num2    num3   num4    num5
1     22      51      4      99      34

Тогда, как я могу получить наименьшее значение, используя SQL?

Ответы [ 6 ]

2 голосов
/ 18 августа 2011

Исправьте свою структуру данных, чтобы она была нормализована, чтобы вам не приходилось делать такие сложные, убивающие производительность вещи, чтобы получить необходимую информацию.

2 голосов
/ 17 августа 2011

вероятно что-то вроде

select id
       , least (num1, num2, num3, num4, num5)
from your_table
/

Большинство разновидностей RDBMS предлагают LEAST ().

1 голос
/ 17 августа 2011

Вы можете создать UDF.

create function GetMin(@N1 int, @N2 int, @N3 int, @N4 int, @N5 int)
returns table as
return (select min(N) as Value
        from (select @N1 
              union all 
              select @N2
              union all 
              select @N3
              union all 
              select @N4
              union all 
              select @N5) as T(N))

И использовать его следующим образом.

declare @T table
(
  id int, 
  num1 int, 
  num2 int, 
  num3 int,  
  num4 int,   
  num5 int
)

insert into @T values
(1,     22,      51,      4,      99,      34),
(2,     222,     251,     24,     299,     234)

select id,
       M.Value
from @T
  cross apply dbo.GetMin(num1, num2, num3, num4, num5) as M

Или вы можете пропустить UDF и использовать запрос напрямую.

select id,
       M.Value
from @T
  cross apply (select min(N) as Value
               from (select num1 
                     union all 
                     select num2
                     union all 
                     select num3
                     union all 
                     select num4
                     union all 
                     select num5) as T(N)) as M
0 голосов
/ 18 августа 2011
SELECT id
     , CASE WHEN num1 < num2 AND num1 < num3 AND num1 < num4 AND num1 < num5
                THEN num1
            WHEN num2 < num3 AND num2 < num4 AND num2 < num5
                THEN num2
            WHEN num3 < num4 AND num3 < num5
                THEN num3
            WHEN num4 < num5
                THEN num4
            ELSE num5
       END AS LeastNum
FROM MyTable
0 голосов
/ 17 августа 2011

TSQL может это сделать, но это требует небольшой подготовки ...

Во-первых, вам нужна функция:(он принимает строку целых чисел с разделителями-запятыми и возвращает наибольшее целое число)

CREATE Function [dbo].[GreatestInt]  
( @Array varchar(max) )
Returns int As  

BEGIN 

DECLARE @end Int
DECLARE @start Int
DECLARE @tbl_int Table (myInt Int)
DECLARE @return Int

SET @Array =  @Array + ',' 
SET @start=1
SET @end=1

WHILE @end<Len(@Array)
    BEGIN
        SET @end = CharIndex(',', @Array, @end)
        INSERT INTO @tbl_int 
            SELECT
                Cast(Substring(@Array, @start, @end-@start) As Int)

        SET @start=@end+1
        SET @end = @end+1
    END

SET @return = (SELECT MAX(myInt) FROM @tbl_int)

RETURN @return
END

И затем для создания строки целых чисел (это часть, в которой TSQL не очень хорош):(в SELECT)

stuff(
        stuff([num5], 1, 0,',')
        ,1,0,
        stuff(
            stuff([num4], 1, 0,',')
            ,1,0,
            stuff(
                stuff([num3], 1, 0,',')
                ,1,0,
                stuff(
                    stuff([num2], 1, 0,',')
                    ,1,0,
                    [num1]
                    )
                )
            )
        )

Итак, чтобы использовать функцию:

SELECT
   id,
   dbo.GreatestInt( stuff(
            stuff([num5], 1, 0,',')
            ,1,0,
            stuff(
                stuff([num4], 1, 0,',')
                ,1,0,
                stuff(
                    stuff([num3], 1, 0,',')
                    ,1,0,
                    stuff(
                        stuff([num2], 1, 0,',')
                        ,1,0,
                        [num1]
                        )
                    )
                )
            )
        )
FROM
   myTable

Причина, по которой я сделал это так, а не то, как @mikael в своем ответе (который я+1, потому что он отвечает на ваш вопрос), заключается в том, что этот подход будет работать на любом количестве полей, а не только на 5. Но, честно говоря, у TSQL есть место для улучшения - им действительно нужна версия plsql для tsqlнаибольшие / наименьшие функции.Ну да ладно ...

0 голосов
/ 17 августа 2011

Вы можете рассчитать мин, используя формулу: MIN (a, b) = (a + b) / 2 - abs (ab) / 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...