Нужна помощь со сложной сортировкой в ​​SQL - PullRequest
3 голосов
/ 26 октября 2009

У меня сложная проблема сортировки с моим оператором SQL. У меня есть таблица со следующими столбцами.

No   Time    Value  
--   ----    -----
 1   0900    ''
 2   1030    ''
 3   1020    ''
 4   1010    ''
 5   1100    ''
 1   1015    'P'
 2   1045    'P'

Я хочу отсортировать эту таблицу, выполнив следующие шаги.

  1. Выберите строки из таблицы, где значение равно '' (пустая строка), и отсортируйте их по номеру

  2. Выберите строки из той же таблицы, где значение равно 'P', а затем отсортируйте их по времени.

  3. Выберите каждую строку из 2) и вставьте в 1) по времени.

Результат должен быть примерно таким.

No   Time    Value  
--   ----    -----
 1   0900    ''
 1   1015    'P'
 2   1030    ''
 3   1020    ''
 4   1010    ''
 2   1045    'P'
 5   1100    ''

Как я могу сделать это в SQL?

Ответы [ 3 ]

2 голосов
/ 26 октября 2009

Редактировать: спасибо за комментарии.

Что касается перечитывания, я не думаю, что третья часть вашего вопроса имеет смысл. Результат шага 1) не отсортирован по времени, и вы не можете вставить его по времени.

Например, в вашем примере результата вторая строка имеет время 1015, то есть между 0900 и 1030. Но это также может быть между 1020 и 1010 строками дальше?

0 голосов
/ 26 октября 2009

К сожалению, я не думаю, что вы можете сделать это с помощью стандартного запроса SQL, и причина в том, что ваш алгоритм не ориентирован на множество. Ваш примерный набор данных иллюстрирует это - у вас есть первая запись 'P', отображаемая между записями 0900 и 1030, но было бы также целесообразно поместить ее между записями 1010 и 1045, основываясь на ваших критериях. Если правильно расположить его в позиции, которую вы показываете, вам нужно изменить свое состояние так, чтобы оно было таким: «поместите каждую строку из # 2 между первыми двумя строками в # 1, которые заключают ее в скобки во времени», где определено «first» по критериям сортировки №1.

В результате этого типа установки, скорее всего, заставит вас в решение на основе курсора. Возможно, вам удастся избежать этого, если вы сможете определить составное значение для заказа, но исходя из того, что у вас есть выше, я не вижу, что это может быть.

0 голосов
/ 26 октября 2009

Кажется, что вы можете выразить свою потребность в более простой потребности.
Вы всегда сортируете по времени, возможно также по значению, а затем по номеру.

    sort by time, value, no

Это отсортирует все по времени. Для двух одинаковых раз будет применена сортировка по значению и т. Д.


Вы можете отсортировать по уникальному номеру, который вы строите, чтобы объединить ваши критерии. Но это было бы более сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...