获取负数最大的行,如果没有负数则获取最小数的行

Get row with largest negative number, or row with smallest number if there are no negative numbers

我正在尝试编写执行以下操作的 Snowflake SQL 语句:

例如,如果我的 table 是:

column_A column_B
-20 1
-5 2
1 3
15 4

结果应该是: -5, 2

如果我的table是:

column_A column_B
1 3
15 4
20 5

结果应该是:1, 3

创建示例table:

with example_table as (
    select
            ::NUMBER as column_A
          , ::NUMBER as column_B
    from
        (values
                 (-20, 1) 
               , (-5, 2)
               , (1, 3) 
               , (15, 4) 
        )
)

select * from example_table

类似于:

order by
    case when column_a < 0 then 1 else 2 end,
    abs(column_a)
offset 0 rows
fetch first 1 row only

基本上你 order by 在两个假列上:

  • 对于所有负值,第一个将包含 1,否则将包含 2,因此这会将所有负值放在第一位,如果有的话
  • 第二个将包含绝对值(例如 -5 变成 5 而 5 仍然是 5)

在SQL中,我会写:

SELECT (
    IFF (
        (SELECT COUNT(*) FROM myTable WHERE column_A < 0) > 0,
        SELECT * FROM myTable WHERE column_A = MAX(column_A),
        SELECT * FROM myTable WHERE column_A = MIN(column_A)
    ) );

这是 IFF 的文档:https://docs.snowflake.com/en/sql-reference/functions/iff.html

可以使用SIGNABS来实现:

SELECT * 
FROM example_table
ORDER BY SIGN(COLUMN_A), ABS(COLUMN_A) LIMIT 1;

符号returns -1 表示负数,0 表示零,1 表示正数。 ABS returns 升序排列的绝对值。 LIMIT 1 将结果集限制为单行。

输出: