如何编写一个函数 returns T-SQL 中具有最大绝对值的数字的总和

How to write a function that returns the sum of the numbers with biggest absolute values in T-SQL

2018年,在我大学的一次数据库测试中(我失败了多次),他们有这样的任务:

Napisati T-SQL funkciju koja prima 3 realna broja, te kao rezultat vraća onaj broj koji ima najveću apsolutnu vrijednost. Ako slučajno istu najveću apsolutnu vrijednost imaju dva ili tri broja potrebno je vratiti zbroj tih brojeva.

即:

Write a T-SQL function that accepts 3 real numbers, and as a result it returns the number that has the biggest absolute value. If accidentally the same biggest absolute value is got by two or three numbers it is necessary to return the sum of those numbers.

你会如何解决这个问题?

这是我的尝试,我不知道它是否正确,也不知道如何在我的电脑上实际测试它:

CREATE FUNCTION max_abs3(@x, @y, @z DECIMAL) RETURNS DECIMAL
BEGIN
    IF ABS(@x)=ABS(@y) AND ABS(@y)=ABS(@z)
    BEGIN
        RETURN @x+@y+@z;
    END;
    IF ABS(@x)=ABS(@y) AND ABS(@x)>ABS(@z)
    BEGIN
        RETURN @x+@y;
    END;
    IF ABS(@x)=ABS(@z) AND ABS(@x)>ABS(@y)
    BEGIN
        RETURN @x+@z;
    END;
    IF ABS(@y)=ABS(@z) AND ABS(@y)>ABS(@x)
    BEGIN
        RETURN @y+@z;
    END;
    IF ABS(@x)>ABS(@y) AND ABS(@x)>ABS(@z)
    BEGIN
        RETURN @x;
    END;
    IF ABS(@y)>ABS(@z) AND ABS(@y)>ABS(@x)
        RETURN @y;
    END;
    RETURN @z;
END;

我只在我的电脑上安装了 SQLite,它显然不支持自定义 SQL 功能。

假设“2018 年”是指解决方案必须在 2018 年有效(因此 SQL Server 2017 或更早版本),那么您可以使用 VALUES 子句将您的值变为一个数据集,然后检查该值是否为最大值,然后聚合。

由于您需要自己执行此操作,函数内部的逻辑如下所示:我让您将其适当地放入 FUNCTION(最好是内联 table 值函数):

SELECT SUM(V.R)
FROM (VALUES(@x),(@y),(@z))V(R)
WHERE ABS(V.R) = (SELECT MAX(sq.R)
                  FROM (VALUES(@x),(@y),(@z))sq(R));

db<>fiddle

在 SQL Server 2022 中有一个新功能,GREATEST 看起来像这样:

WITH V AS(
    SELECT R
    FROM (VALUES(@x),(@y),(@z))V(R))
SELECT SUM(R)
FROM V
WHERE ABS(V.R) = GREATEST(@x,@y,@z);