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
我有一个要求,当 > 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