powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парная выборка предметов
19 сообщений из 19, страница 1 из 1
Парная выборка предметов
    #39984602
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая возникла проблема, никак не могу сообразить.
Есть список предметов - предмет повторяется в базе несколько раз, есть колонка с нумерацией этих предметов 1,2,3... и т.д. Количество повторений произвольное.
Делается выборка по предметам, например такая = предмет 1 - позиция 3, предмет 2 - позиция 4, предмет 3 - позиция - 1.
Предположим, такая выборка завязана на коробку 1, то есть
Код: sql
1.
SELECT * FROM SomeTable WHERE Box = 1


Выбираем, и получаем выше описаный результат.
Как сделать запрос, чтобы в результате получалось еще и следущая позиция предмета, то есть
предмет 1 - позиция 3-4, предмет 2 - позиция 4-5, предмет 3 - позиция - 1-2.
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984610
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как я нахожу следующий номер предмета в списке
Код: sql
1.
2.
3.
SELECT CHook, CRowASC INTO #Temp FROM SomeTable WHERE Box = 1
UPDATE #Temp SET CRowASC = CRowASC + 1
SELECT m.CHook,m.CRowASC FROM SomeTable m JOIN #Temp t on (m.CHook = t.CHook) AND (m.CRowASC = t.CRowASC)


Вопрос. как объеденить две эти выборки в одну?
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984611
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
select 
   cast([колонка с нумерацией этих предметов] as varchar) + '-' + 
      isnull(cast(lead([колонка с нумерацией этих предметов])over(partition by предмет order by [колонка с нумерацией этих предметов]) as varchar),'') 
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984622
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В вашем примере просто выбырается весь список предметов с порядковым номером. Это не то, о чем я спрашивал...
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984624
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разучить LEAD() и LAG().
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984627
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну да, в моем примере можно было бы использовать LEAD, но проблемы это не решает.
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984629
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noram
В вашем примере просто выбырается весь список предметов с порядковым номером. Это не то, о чем я спрашивал...
таа, тебя попробуй пойми ещё ...


noram
Вот как я нахожу следующий номер предмета в списке
Код: sql
1.
2.
3.
SELECT CHook, CRowASC INTO #Temp FROM SomeTable WHERE Box = 1
UPDATE #Temp SET CRowASC = CRowASC + 1
SELECT m.CHook,m.CRowASC FROM SomeTable m JOIN #Temp t on (m.CHook = t.CHook) AND (m.CRowASC = t.CRowASC)



Вопрос. как объеденить две эти выборки в одну?

Код: sql
1.
2.
3.
SELECT CHook, CRowASC FROM SomeTable WHERE Box = 1
union all
SELECT m.CHook,m.CRowASC FROM SomeTable m JOIN SomeTable t on (m.CHook = t.CHook) AND (m.CRowASC = t.CRowASC+1) and t.Box = 1 
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984630
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, LEAD добавляет дополнительную колонку, а мне надо "чистая" выборка - есть известные порядковые номера предметов, надо чтобы в результпте отображались эти номера ПЛЮС номера на один больше.
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984632
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as
(
 select
  CHook, CRowASC,
  lead(CRowASC) over (partition by CHook order by CRowASC) as CRowASC__next
 from
  SomeTable
 where
  Box = 1
)
select
 t.CHook, a.CRowASC
from
 t cross apply
 (values (t.CRowASC), (t.CRowASC__next)) a(CRowASC);
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984633
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
SELECT CHook, CRowASC FROM SomeTable WHERE Box = 1
union all
SELECT m.CHook,m.CRowASC FROM SomeTable m JOIN SomeTable t on (m.CHook = t.CHook) AND (m.CRowASC = t.CRowASC+1) and t.Box = 1 


Court - замечательно, спасибо большое, то, что доктор прописал. Еще бы подстазали, куда и как можно приставить ORDER BY - у меня не получается....
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984639
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noram
Еще бы подстазали, куда и как можно приставить ORDER BY - у меня не получается....

Код: sql
1.
2.
3.
4.
5.
select * from 
  (SELECT CHook, CRowASC FROM SomeTable WHERE Box = 1
  union all
  SELECT m.CHook,m.CRowASC FROM SomeTable m JOIN SomeTable t on (m.CHook = t.CHook) AND (m.CRowASC = t.CRowASC+1) and t.Box = 1) t
order by 1 
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984643
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court - огромное спасибо! Мир не без добрых людей! invm - спасибо за риспонс - но не работает - номер следующей строки - NULL
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984646
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
noram, в lead - default значение не обозначено, отсюда и null. Взгляните из справки пример.
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984648
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, еще один вопросик (если позволите), тоже по теме. Часто мне надо выбырать не по парной нумирации, как мы сейчас обсуждали, а следующий номер предмета. Я всегда высчитывал следующую строку через временную таблицу, а потом через join как показал выше. Next порядковый номер предмета. Может подскажите более элегантное решение, ноподобие того, как вы предложили?
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984652
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noram
Может подскажите более элегантное решение, ноподобие того, как вы предложили?

22174629
только, раз NULL не должен быть в результате, ещё добавить в запрос условие
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as
(
 select
  Box, CHook, CRowASC,
  lead(CRowASC) over (partition by CHook order by CRowASC) as CRowASC__next
 from
  SomeTable
)
select
 t.CHook, a.CRowASC
from
 t cross apply
 (values (t.CRowASC), (t.CRowASC__next)) a(CRowASC)
where t.Box = 1 and a.CRowASC is not null
;
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984655
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да NULL пусть будет, если там дейсвительно NULL, а в примере invm NULL присутствует там, где ему не место. Но это мелочи. В вашем примере, куда тулить название таблицы, у меня не получается....
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984656
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все прекрасно работает! Еще раз спасибо! С меня ящик пива!
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984738
Андрей Юниор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noram
Еще бы подстазали, куда и как можно приставить ORDER BY - у меня не получается....

В последнем селекте - должно работать. Если нужно into #tempTable, то в первом селекте. Ещё можно примеры на UNION в документации посмотреть .
...
Рейтинг: 0 / 0
Парная выборка предметов
    #39984815
noram
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо Андрей, разобрался....
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парная выборка предметов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]