Есть ли в SQL Server функция Max, которая принимает два значения, такие как Math.Max ​​в .NET? - PullRequest
434 голосов
/ 24 сентября 2008

Я хочу написать запрос, подобный этому:

SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

Но это не так, как работает функция MAX, верно? Это агрегатная функция, поэтому она ожидает один параметр, а затем возвращает MAX всех строк.

Кто-нибудь знает, как это сделать по-моему?

Ответы [ 28 ]

1 голос
/ 21 октября 2010

Для ответа выше относительно больших чисел вы можете выполнить умножение перед сложением / вычитанием. Это немного громоздче, но не требует приведения. (Я не могу говорить о скорости, но я предполагаю, что это все еще довольно быстро)

ВЫБРАТЬ 0,5 * ((@ val1 + @ val2) + ABS (@ val1 - @ val2))

Меняется на

SELECT @ val1 * 0.5 + @ val2 * 0.5 + ABS (@ val1 * 0.5 - @ val2 * 0.5)

как минимум альтернатива, если вы хотите избежать каста.

1 голос
/ 18 февраля 2011

В простейшем виде ...

CREATE FUNCTION fnGreatestInt (@Int1 int, @Int2 int )
RETURNS int
AS
BEGIN

    IF @Int1 >= ISNULL(@Int2,@Int1)
        RETURN @Int1
    ELSE
        RETURN @Int2

    RETURN NULL --Never Hit

END
1 голос
/ 24 сентября 2008

Вы можете сделать что-то вроде этого:

select case when o.NegotiatedPrice > o.SuggestedPrice 
then o.NegotiatedPrice
else o.SuggestedPrice
end
0 голосов
/ 13 февраля 2019

Расширяя ответ Xin и предполагая, что типом значения сравнения является INT, этот подход также работает:

SELECT IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)

Это полный тест с примерами значений:

DECLARE @A AS INT
DECLARE @B AS INT

SELECT  @A = 2, @B = 1
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 2

SELECT  @A = 2, @B = 3
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 3

SELECT  @A = 2, @B = NULL
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 2    

SELECT  @A = NULL, @B = 1
SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
-- 1
0 голосов
/ 12 февраля 2019
 -- Simple way without "functions" or "IF" or "CASE"
 -- Query to select maximum value
 SELECT o.OrderId
  ,(SELECT MAX(v)
   FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) AS MaxValue
  FROM Order o;
0 голосов
/ 13 ноября 2017

В Presto вы можете использовать команду

SELECT array_max(ARRAY[o.NegotiatedPrice, o.SuggestedPrice])
0 голосов
/ 04 октября 2017
select OrderId, (
    select max([Price]) from (
        select NegotiatedPrice [Price]
        union all
        select SuggestedPrice
    ) p
) from [Order]
0 голосов
/ 20 апреля 2017

Вот ответ @Scott Langham с простой обработкой NULL:

SELECT
      o.OrderId,
      CASE WHEN (o.NegotiatedPrice > o.SuggestedPrice OR o.SuggestedPrice IS NULL) 
         THEN o.NegotiatedPrice 
         ELSE o.SuggestedPrice
      END As MaxPrice
FROM Order o
...