Как выбрать записи в определенной мной последовательности

Jenstel
Дата: 29.01.2013 20:34:07
Имеется выборка со столбцом Position (постоет при помощи Row_Number для сортировки по адресам Город, Улица, Дом)
|Position |
----------
|1 |
|2 |
|3 |
|4 |
|5 |
|6 |
|7 |
|8 |
|9 |
|.... |
|300 |
Число записей может меняться и соответственно последнее значение Position будет равно числу записей.

Нужно выбрать записи в таком порядке 1, 151, 2, 152, 3, 153, 4, 154 ... , ...
Т.е. первая запись остается первой, а второй является запись ровно из середины выборки и так далее. Данная выборка будет производится в FastReport для формирования и печати адресных карточек (всего около 9000 адресов). Данный порядок нужен потому, что карточки будут формироваться по порядку на листах А4, каждая из которых будет занимать ровно половину листа (формат А5).
Как можно реализовать такую выборку средствами SQL Server или может FastReport? Заранее спасибо.
invm
Дата: 29.01.2013 21:09:08
with x(n) as
(
 select 1 union all
 select 2 union all
 select 3 union all
 select 4 union all
 select 5 union all
 select 6 union all
 select 7 union all
 select 8
)
select
 n
from
 x
order by
 isnull(nullif(n % (max(n) over () / 2), 0), 2147483647), n;
Jenstel
Дата: 29.01.2013 21:12:46
invm
(
 select 1 union all
 select 2 union all
 select 3 union all
 select 4 union all
 select 5 union all
 select 6 union all
 select 7 union all
 select 8
)


Это вручную писать? Число записей может меняться и доходить до 9000
Можно подробнее описать Ваш пост? Особенно строку
order by
 isnull(nullif(n % (max(n) over () / 2), 0), 2147483647), n;
Cygapb-007
Дата: 29.01.2013 21:23:03
маленькая поправочка для нечетного количества
with x(n) as
(
   select top(51) number from master..spt_values where type='P' and number>0
)
select
 n
from
 x
order by
 isnull(nullif(n % ((max(n) over ()+1) / 2), 0), 2147483647), n;
Jenstel
Дата: 29.01.2013 22:00:21
Cygapb-007
маленькая поправочка для нечетного количества
with x(n) as
(
   select top(51) number from master..spt_values where type='P' and number>0
)
select
 n
from
 x
order by
 isnull(nullif(n % ((max(n) over ()+1) / 2), 0), 2147483647), n;


С этим разобрался. А если в выборке имеется еще и поле Format со значением 0 или 1, то как вывести сначала записи с Format=0 в таком порядке, а потом с Format=1 в обычном порядке?
invm
Дата: 29.01.2013 22:22:01
Вообще, в общем случае можно обойтись и без Position, если он не нужен в отчете:
order by
 isnull(nullif(row_number() over (<выражение, определяющее Position>) % ((count(*) over () + 1) / 2), 0), 2147483647), row_number() over (<выражение, определяющее Position>);
А еще лучше задействовать многоколоночность в отчете.
Jenstel
Дата: 29.01.2013 23:21:14
invm
Вообще, в общем случае можно обойтись и без Position, если он не нужен в отчете:
order by
 isnull(nullif(row_number() over (<выражение, определяющее Position>) % ((count(*) over () + 1) / 2), 0), 2147483647), row_number() over (<выражение, определяющее Position>);
А еще лучше задействовать многоколоночность в отчете.


Position нужна для сортировки по адресу, чтобы улицы и дома шли по порядку
Format определяет те строки, которые в отчет попадут на отдельные страницы, а значит не подвергнутся резке и должны быть упорядочены по Position (по адресам)
invm
Дата: 29.01.2013 23:46:37
Jenstel
А если в выборке имеется еще и поле Format со значением 0 или 1, то как вывести сначала записи с Format=0 в таком порядке, а потом с Format=1 в обычном порядке?
with x(n, format) as
(
 select 1, 0 union all
 select 2, 0 union all
 select 3, 0 union all
 select 4, 0 union all
 select 5, 0 union all
 select 6, 1 union all
 select 7, 1 union all
 select 8, 1
)
select
 n
from
 x
order by
 format,
 case when format = 0 then
  isnull(nullif(row_number() over (partition by format order by n) % ((count(*) over (partition by format) + 1) / 2), 0), 2147483647)
 end,
 row_number() over (partition by format order by n);
aleks2
Дата: 30.01.2013 06:11:46
invm
Jenstel
А если в выборке имеется еще и поле Format со значением 0 или 1, то как вывести сначала записи с Format=0 в таком порядке, а потом с Format=1 в обычном порядке?
with x(n, format) as
(
 select 1, 0 union all
 select 2, 0 union all
 select 3, 0 union all
 select 4, 0 union all
 select 5, 0 union all
 select 6, 1 union all
 select 7, 1 union all
 select 8, 1
)
select
 n
from
 x
order by
 format,
 case when format = 0 then
  isnull(nullif(row_number() over (partition by format order by n) % ((count(*) over (partition by format) + 1) / 2), 0), 2147483647)
 end,
 row_number() over (partition by format order by n);

Охренеть... как загибают.
with x(n) as
(
 select 1 union all
 select 2 union all
 select 3 union all
 select 4 union all
 select 5 union all
 select 6 union all
 select 7 union all
 select 151 union all
 select 152 union all
 select 153 union all
 select 154 union all
 select 155 union all
 select 156
)
select
 n
from
 x
order by
  case when n>=151 then 2*(n - 150)+1 else 2*(n) end