Сортировка и группировка данных в Oracle

#sql #oracle #sorting

#sql #Oracle #сортировка

Вопрос:

Кто-то по ошибке ввел отрицательные значения в столбец уникального ключа давно назад, и теперь я должен сгруппировать данные, выбрав максимальный идентификатор в соответствии с категорией, чтобы извлечь отчет. Столбец 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. Пожалуйста , покажите свой sql.

2. выберите max (идентификатор) из группы имя_таблицы по категориям. Но запрос завершается ошибкой при отрицательных значениях.

3. max(id) отлично работает для отрицательных чисел. Вы изучали неравенства для отрицательных чисел? Вы помните из средней школы, что -100 БОЛЬШЕ, чем -900, а не меньше, как вы, кажется, думаете? max(id) для category = 'C' -7654. Или вы имеете в виду что-то другое? Например, «знак минус следует игнорировать»? Если это назначение, то max(id) это неправильное решение!

4. Похоже, у вас серьезные проблемы с целостностью данных. Если вы не можете полагаться на набор столбцов для определения правильного результата (дата иногда равна нулю и т.д.), Как мы должны это делать?

5. Я сдаюсь. Вы выражаетесь неясно. Вы должны серьезно исправить идентификатор должным образом, что должно быть легко сделать, независимо от того, насколько он «массивный».

Ответ №1:

«Таким образом, идентификатор с наибольшими отрицательными значениями будет содержать последние данные до 2010 года, а идентификатор с положительными значениями будет создан после 2010 года»

Это означает, что в случае наличия положительных идентификаторов для категории вам нужен максимальный (например, 45678 для категории A), а в противном случае — минимальный (например, -8904 для категории C). Для этого вы можете использовать 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 ).

Комментарии:

1. Чувак, это потрясающе. Ты гений