我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?
MIN函数作用于列,而不是变量。
我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?
MIN函数作用于列,而不是变量。
当前回答
对于SQL Server 2022+(或MySQL或PostgreSQL 9.3+),更好的方法是使用LEAST和GREATEST函数。
SELECT GREATEST(A.date0, B.date0) AS date0,
LEAST(A.date1, B.date1, B.date2) AS date1
FROM A, B
WHERE B.x = A.x
:
GREATEST(value[,…]):返回所提供值中的最大(最大值)参数 LEAST(value[,…])从所提供的值中返回最小的(最小值)参数
文档链接:
MySQL http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html Postgres https://www.postgresql.org/docs/current/functions-conditional.html SQL Server https://learn.microsoft.com/en-us/sql/t-sql/functions/logical-functions-least-transact-sql
其他回答
这里有一个技巧,如果你想计算最大值(字段,0):
SELECT (ABS(field) + field)/2 FROM Table
如果字段为负,则返回0,否则返回字段。
Select MIN(T.V) FROM (Select 1 as V UNION Select 2 as V) T
基于mathematix和scottyc的出色逻辑/代码,我提交:
DECLARE @a INT, @b INT, @c INT = 0;
WHILE @c < 100
BEGIN
SET @c += 1;
SET @a = ROUND(RAND()*100,0)-50;
SET @b = ROUND(RAND()*100,0)-50;
SELECT @a AS a, @b AS b,
@a - ( ABS(@a-@b) + (@a-@b) ) / 2 AS MINab,
@a + ( ABS(@b-@a) + (@b-@a) ) / 2 AS MAXab,
CASE WHEN (@a <= @b AND @a = @a - ( ABS(@a-@b) + (@a-@b) ) / 2)
OR (@a >= @b AND @a = @a + ( ABS(@b-@a) + (@b-@a) ) / 2)
THEN 'Success' ELSE 'Failure' END AS Status;
END;
虽然从scottyc的MIN函数到MAX函数的跳跃对我来说应该是显而易见的,但它不是,所以我已经解决了它,并将其包含在这里:SELECT @a + (ABS(@b-@a) + (@b-@a)) / 2。这些随机生成的数字虽然不是证据,但至少应该让怀疑论者相信这两个公式都是正确的。
我遇到的情况是,我必须在一次更新中找到最多4个复杂的选择。 用这种方法,你可以有很多你喜欢的!
您还可以用其他选择替换这些数字
select max(x)
from (
select 1 as 'x' union
select 4 as 'x' union
select 3 as 'x' union
select 2 as 'x'
) a
更复杂的用法
@answer = select Max(x)
from (
select @NumberA as 'x' union
select @NumberB as 'x' union
select @NumberC as 'x' union
select (
Select Max(score) from TopScores
) as 'x'
) a
我相信UDF有更好的性能。
对于SQL Server 2022+(或MySQL或PostgreSQL 9.3+),更好的方法是使用LEAST和GREATEST函数。
SELECT GREATEST(A.date0, B.date0) AS date0,
LEAST(A.date1, B.date1, B.date2) AS date1
FROM A, B
WHERE B.x = A.x
:
GREATEST(value[,…]):返回所提供值中的最大(最大值)参数 LEAST(value[,…])从所提供的值中返回最小的(最小值)参数
文档链接:
MySQL http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html Postgres https://www.postgresql.org/docs/current/functions-conditional.html SQL Server https://learn.microsoft.com/en-us/sql/t-sql/functions/logical-functions-least-transact-sql