#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. Чувак, это потрясающе. Ты гений