Помощь.Сложная сортировка.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: Помощь.Сложная сортировка.Oracle
От: Softwarer http://softwarer.ru
Дата: 01.11.13 07:51
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>1.Если есть X2 is not null,

А> то первая строка результата = строке с MAX(X2),

Заведите привычку сразу задаться вопросом "а если таких строк несколько?"

А>2.Если все X2 is not

А> то строки сортируются по X1 ASC

Ну давайте думать. Во-первых, надо определить max(x2). Во-вторых, отсортировать по x2 == max(x2) ? 1 : 0. В-третьих, отсортировать по x1. Какой шаг вызывает затруднения?
Re[2]: Помощь.Сложная сортировка.Oracle
От: avpavlov  
Дата: 01.11.13 08:02
Оценка: 1 (1)
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


Правда что твой, что мой означают "до свидания, индексы"
Re[2]: Помощь.Сложная сортировка.Oracle
От: Аноним  
Дата: 01.11.13 08:12
Оценка:
Здравствуйте, Softwarer, Вы писали:

"а если таких строк несколько?"
взять любую
Ну давайте думать.
Давайте
Re[3]: Помощь.Сложная сортировка.Oracle
От: Softwarer http://softwarer.ru
Дата: 01.11.13 08:22
Оценка:
Здравствуйте, 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

Результат не соответствует требованию))
Re[3]: Помощь.Сложная сортировка.Oracle
От: Softwarer http://softwarer.ru
Дата: 01.11.13 08:26
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Правда что твой, что мой означают "до свидания, индексы"


В том смысле, в котором ты имеешь в виду — когда в Оракле идёт сортировка по nullable полю, это уже означает "до свидания, индексы". Впрочем, есть варианты. Но в любом случае сейчас у коллеги проблема — вообще написать запрос. А об его эффективности думать немного рано, имхо.
Re[3]: Помощь.Сложная сортировка.Oracle
От: Softwarer http://softwarer.ru
Дата: 01.11.13 08:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну давайте думать.

А>Давайте

О, я уже давно думаю. Например, прямо сейчас я думаю пойти пообедать.
Re: Помощь.Сложная сортировка.Oracle
От: Аноним  
Дата: 01.11.13 08:45
Оценка:
Всем спасибо
SQL.RU (stax..)

lag(null,1,x2) over (order by x2 desc nulls last,x1) nulls last,x1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.