Sql Oracle中的数据排序与分组

Sql Oracle中的数据排序与分组,sql,oracle,sorting,Sql,Oracle,Sorting,有人错误地将负值输入到唯一键列 很久以前,现在我必须将数据分组,根据类别选择ID的最大值以提取报告。ID列现在同时具有正值和负值 ID Category 45678 A 234567 B -4578 A -45798 A -7890 C -8904 C -7654 C Max(ID)函数在负值下无法正常工作 ID Category 45678 A 234

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

    ID   Category
    45678    A
    234567   B
    -4578    A
    -45798    A
    -7890    C
    -8904    C
    -7654    C
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
“因此,最大负值的ID将在2010年之前获得最新数据 具有正值的id将在2010年后创建”

这意味着,如果某个类别的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将在2010年之前获得最新数据 具有正值的id将在2010年后创建”

这意味着,如果某个类别的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;

这将按符号(负数排在正数之前,因此如果有正数,您会更喜欢这些符号)然后按绝对数(这样您会得到最高的负数或正数作为最后一行,这是您用
KEEP last
选择的行)。

请显示您的sql。请按类别从表_name group中选择max(id)。但是查询负数时失败。
max(id)
对于负数非常有效。你研究过负数的不等式吗?你还记得吗,从中学开始,-100大于-900,而不是像你想象的那样小<代码>最大(id)对于
类别='C'
为-7654。或者你是说别的什么?比如“应该忽略减号”?如果这是分配,那么
max(id)
是错误的解决方案!听起来您有一些严重的数据完整性问题。如果你不能依靠一组列来确定正确的结果(日期有时是空的,等等),我们该怎么做呢?我放弃了。你说的不清楚。您应该认真正确地修复ID,这应该很容易做到,无论它有多大。请显示您的sql。按类别从表_名称组中选择最大(ID)。但是查询负数时失败。
max(id)
对于负数非常有效。你研究过负数的不等式吗?你还记得吗,从中学开始,-100大于-900,而不是像你想象的那样小<代码>最大(id)对于
类别='C'
为-7654。或者你是说别的什么?比如“应该忽略减号”?如果这是分配,那么
max(id)
是错误的解决方案!听起来您有一些严重的数据完整性问题。如果你不能依靠一组列来确定正确的结果(日期有时是空的,等等),我们该怎么做呢?我放弃了。你说的不清楚。你应该认真地正确地修复ID,这应该很容易做到,不管它有多大。你是一个天才,太神奇了。你是个天才