Oracle中的数据排序和分组

时间:2016-10-20 23:31:33

标签: sql oracle sorting

有人错误地将负值输入到唯一键列 很久以前我现在必须将数据分组,根据类别选择最大ID以提取报告。 ID列现在具有正值和负值。

Max(ID)函数无法正确处理负值。

    ID   Category
    45678    A
    234567   B
    -4578    A
    -45798    A
    -7890    C
    -8904    C
    -7654    C

预期的O / P

ID   Category
45678    A
234567   B 
-8904    C

1 个答案:

答案 0 :(得分:3)

  

“因此具有最大负值的ID将在2010年之前拥有最新数据   并且在2010年之后创建具有正值的id

这意味着如果您想要最大类别的正ID(例如,类别A为45678),则为最小值(例如,类别C为-8904)。您可以使用Oracle的KEEP FIRST/LAST

select 
  category, 
  max(id) keep (dense_rank last order by sign(id), abs(id))
from mytable
group by category
order by category;

这会按符号对您的ID进行排序(正数之前是负数,所以如果有正数,那么您更喜欢这些),然后是绝对数量(因此您获得最高的负数或正数作为最后一行,这是一个你选择KEEP LAST)。