Group BY 中的最大值和最小值

Max and min both in a Group BY

我有一个要求,当 > 0 时我需要提取最大数据,当 < 0 时我需要提取最小数据。棘手的部分是它应该在同一列中。示例如下: 下面的查询:

SELECT A.employee_id, paycheck_number
      max ( CASE 
           WHEN B.special = 'XXT' THEN B.AMOUNT
           ELSE 0 
         END ) AMOUNT, 
       max ( CASE 
           WHEN B.special = 'XXH' THEN B.hrs1
           ELSE 0 
         END ) HRS1
FROM   Table1 A, 
       table2 B 
       LEFT OUTER JOIN table3 C 
                    ON B.company = C.company 
WHERE  A .employee_id = '123456789' 
GROUP  BY A.employee_id, paycheck_number 
ORDER  BY 1 

Returns:

EMPLOYEE_ID   AMOUNT     HRS1     paycheck_number
123456789     2799.82    134.84   1234
123456789     832.86     40       4321
123456789     0          0        5678

如果按数据删除分组为:

EMPLOYEE_ID   AMOUNT     HRS1     paycheck_number
123456789     0          134.84   1234
123456789     2799.82    0        1234
123456789     0          40       4321
123456789     832.86     0        4321
123456789     0          -40      5678
123456789     -832.86    0        5678

而我想要:

EMPLOYEE_ID   AMOUNT     HRS1     paycheck_number
123456789     2799.82    134.84   1234
123456789     832.86     40       4321
123456789     -832.86    -40      5678

它看起来很简单,但是当我尝试时它不起作用。

在 Oracle 中,您通过 KEEP DENSE_RANK FIRST/LAST:

获得最大绝对数量的值
max(value) keep (dense_rank last order by abs(value))

但是,当一个记录中始终只有一个非零值而其他记录中始终只有一个非零值需要考虑时,您可以简单地添加它们:

sum(value)

在您的情况下,实际上只有一个记录包含一个值,您正在自己创建零条目,因此在要求最大值时得到 0 而不是 -40。删除创建干扰零的 ELSE 分支,MAX 将为您提供正确的值。例如:

max(case when b.special = 'XXT' then b.amount end) as amount