S>Заведите привычку сразу задаться вопросом "а если таких строк несколько?"
S>Ну давайте думать. Во-первых, надо определить max(x2). Во-вторых, отсортировать по x2 == max(x2) ? 1 : 0. В-третьих, отсортировать по x1. Какой шаг вызывает затруднения?
вариант попроще, который более предсказуемо ведет себя, если строк несколько
order by
case when x2 is null then 0 else 1 end desc,
x2 desc,
x1 asc
Правда что твой, что мой означают "до свидания, индексы"
Здравствуйте, Аноним, Вы писали:
А>1.Если есть X2 is not null, А> то первая строка результата = строке с MAX(X2),
Заведите привычку сразу задаться вопросом "а если таких строк несколько?"
А>2.Если все X2 is not А> то строки сортируются по X1 ASC
Ну давайте думать. Во-первых, надо определить max(x2). Во-вторых, отсортировать по x2 == max(x2) ? 1 : 0. В-третьих, отсортировать по x1. Какой шаг вызывает затруднения?
Помощь.Сложная сортировка.Oracle
От:
Аноним
Дата:
01.11.13 06:51
Оценка:
Имеем таблицу T c полями типа ДАТЫ X1(Not NULL) и X2(NULLABLE)
Надо вывести результат след. образом:
1.Если есть X2 is not null,
то первая строка результата = строке с MAX(X2), остальные строки сортируются по X1 ASC
иначе
2.Если все X2 is not
то строки сортируются по X1 ASC
Re[2]: Помощь.Сложная сортировка.Oracle
От:
Аноним
Дата:
01.11.13 08:12
Оценка:
Здравствуйте, Softwarer, Вы писали:
"а если таких строк несколько?"
взять любую
Ну давайте думать.
Давайте
Здравствуйте, avpavlov, Вы писали:
A>вариант попроще, который более предсказуемо ведет себя, если строк несколько
Может, и предсказуемо, но не так, как требуется в вопросе.
A>order by A> case when x2 is null then 0 else 1 end desc,
А почему бы не просто order by x2 desc nulls last?
Re[3]: Помощь.Сложная сортировка.Oracle
От:
Аноним
Дата:
01.11.13 08:22
Оценка:
Здравствуйте, avpavlov, Вы писали:
вариант попроще
select *
FROM
(
select to_date('03.01.2013','dd.mm.yyyy') x1 , to_date('02.01.2013','dd.mm.yyyy') x2 from dual
union all
select to_date('02.01.2013','dd.mm.yyyy') x1 , to_date('02.01.2013','dd.mm.yyyy') x2 from dual
union all
select to_date('04.01.2013','dd.mm.yyyy') x1 , to_date(null,'dd.mm.yyyy') x2 from dual
union all
select to_date('01.01.2013','dd.mm.yyyy') x1 , to_date(null,'dd.mm.yyyy') x2 from dual
)
order by
case when x2 is null then 0 else 1 end desc,
x2 desc,
x1 asc
Здравствуйте, avpavlov, Вы писали:
A>Правда что твой, что мой означают "до свидания, индексы"
В том смысле, в котором ты имеешь в виду — когда в Оракле идёт сортировка по nullable полю, это уже означает "до свидания, индексы". Впрочем, есть варианты. Но в любом случае сейчас у коллеги проблема — вообще написать запрос. А об его эффективности думать немного рано, имхо.