Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Всем привет!

Возможно ли такое сделать?

Есть таблица Tab1 с тремя полями-

Pole1 Pole2 Pole3
Znach10K1S
Znach20K2S
Znach30K1S
Znach40K2S
Znach51K2S
Znach60K2S
Znach70K1S
Znach80K2S


Нужно показать Pole1, если Pole2='1K' и показать все поля-предшественники до первого по отношению к записи с '1K' - Pole3='1S', включая само это поле и не включая поле, которое тоже с '1S', но последнее после выбранного '1K' .

т.е. должно получить вот это:
where Pole2='1K'

Pole1 Pole2 Pole3
Znach30K1S
Znach40K2S
Znach51K2S
Znach60K2S
23 май 14, 13:24    [16061110]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
показать все поля-предшественники

И что задает порядок "предшествования" ?
23 май 14, 13:27    [16061120]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
показать все поля-предшественники

И что задает порядок "предшествования" ?


получается ничего...
нужен алгоритм, который бы искал предыдущие по порядку поля до первого поля с "1S", включал его и искал поля после выбранного значения до следующего поля с "1S" и уже не включал его и всё что после него. Можно ли такой алгоритм написать на t-cql?
23 май 14, 13:30    [16061143]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
нужен алгоритм, который бы искал предыдущие по порядку поля до первого поля с "1S"

Если нет задающего порядок поля, то как можно искать что-то последующее или предыдущее ?
23 май 14, 13:34    [16061162]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LisSp
Glory
пропущено...

И что задает порядок "предшествования" ?


получается ничего...
нужен алгоритм, который бы искал предыдущие по порядку поля до первого поля с "1S", включал его и искал поля после выбранного значения до следующего поля с "1S" и уже не включал его и всё что после него. Можно ли такой алгоритм написать на t-cql?
Если я записи на первом рисунке расставлю в другом порядке,
то как Вы докажете, что Ваш порядок - правильный?
23 май 14, 13:34    [16061171]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
LisSp
пропущено...


получается ничего...
нужен алгоритм, который бы искал предыдущие по порядку поля до первого поля с "1S", включал его и искал поля после выбранного значения до следующего поля с "1S" и уже не включал его и всё что после него. Можно ли такой алгоритм написать на t-cql?
Если я записи на первом рисунке расставлю в другом порядке,
то как Вы докажете, что Ваш порядок - правильный?


представим, что этот порядок-это постоянное и не изменяемое
23 май 14, 13:50    [16061289]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
представим, что этот порядок-это постоянное и не изменяемое

Т.е. в тексте запроса так и написать сереру - "представь, что этот порядок постоянный и неизменяемый" ?
Может тогда просто ему написать - "слышь, сделай все правильно" ?
23 май 14, 13:52    [16061309]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
нужен алгоритм, который бы искал предыдущие по порядку поля до первого поля с "1S"

Если нет задающего порядок поля, то как можно искать что-то последующее или предыдущее ?


может методом перебора значений? Перебирая каждое значение Pole3 до поиска нужных. Это невозможно в SQL?
23 май 14, 13:53    [16061317]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
представим, что этот порядок-это постоянное и не изменяемое

Т.е. в тексте запроса так и написать сереру - "представь, что этот порядок постоянный и неизменяемый" ?
Может тогда просто ему написать - "слышь, сделай все правильно" ?


это же не просто рандомный порядок. Есть готовый запрос, который выводит именно такой порядок.
23 май 14, 13:55    [16061331]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
может методом перебора значений? Перебирая каждое значение Pole3 до поиска нужных. Это невозможно в SQL?

Еще раз
Вот сделает сервер select из вашей таблицы.
Как он добьется "этот порядок постоянный и неизменяемый", если один порядок не отличим от другого ?
23 май 14, 13:55    [16061337]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
может методом перебора значений? Перебирая каждое значение Pole3 до поиска нужных. Это невозможно в SQL?

Еще раз
Вот сделает сервер select из вашей таблицы.
Как он добьется "этот порядок постоянный и неизменяемый", если один порядок не отличим от другого ?


порядок устанавливается по Pole1
23 май 14, 13:58    [16061359]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
Glory
Member

Откуда:
Сообщений: 104751
LisSp
порядок устанавливается по Pole1

Наконец то
23 май 14, 14:00    [16061378]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
порядок устанавливается по Pole1

Наконец то


ну да.. туплю(((
23 май 14, 14:02    [16061385]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
порядок устанавливается по Pole1

Наконец то


прошу понять, простить и помочь)
Можно ли что-то всё-таки сделать в этой задаче методами t-sql?
23 май 14, 14:06    [16061415]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
LisSp,

а версия какая?
23 май 14, 14:31    [16061604]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
LisSp
Glory
пропущено...

Наконец то


прошу понять, простить и помочь)
Можно ли что-то всё-таки сделать в этой задаче методами t-sql?



навскидку
create table #t (p1 int, p2 int, p3 int)
insert #t values (1,0,1),(2,0,2),(3,0,1),(4,0,2),(5,1,2),(6,0,2),(7,0,1),(8,0,2)

select t1.* from #t t1 join
(select p11,p22 from 
#t t1 
cross apply (select top 1 p1 p11 from #t where p1 < t1.p1 and p3 = 1 and t1.p2 = 1 order by p1 desc) t2
cross apply (select top 1 p1 p22 from #t where p1 > t1.p1 and p3 = 1 and t1.p2 = 1  order by p1 desc) t3) t2
on t1.p1 >= p11 and t1.p1 < p22
23 май 14, 14:34    [16061638]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
LisSp,

а версия какая?


2008 R2 standart
23 май 14, 14:36    [16061648]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
WarAnt
LisSp
пропущено...


прошу понять, простить и помочь)
Можно ли что-то всё-таки сделать в этой задаче методами t-sql?



навскидку
create table #t (p1 int, p2 int, p3 int)
insert #t values (1,0,1),(2,0,2),(3,0,1),(4,0,2),(5,1,2),(6,0,2),(7,0,1),(8,0,2)

select t1.* from #t t1 join
(select p11,p22 from 
#t t1 
cross apply (select top 1 p1 p11 from #t where p1 < t1.p1 and p3 = 1 and t1.p2 = 1 order by p1 desc) t2
cross apply (select top 1 p1 p22 from #t where p1 > t1.p1 and p3 = 1 and t1.p2 = 1  order by p1 desc) t3) t2
on t1.p1 >= p11 and t1.p1 < p22


Спасибо! Только у меня этих #t values может быть несколько тысяч и число плавающее
23 май 14, 14:38    [16061662]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
LisSp
WarAnt
пропущено...



навскидку
create table #t (p1 int, p2 int, p3 int)
insert #t values (1,0,1),(2,0,2),(3,0,1),(4,0,2),(5,1,2),(6,0,2),(7,0,1),(8,0,2)

select t1.* from #t t1 join
(select p11,p22 from 
#t t1 
cross apply (select top 1 p1 p11 from #t where p1 < t1.p1 and p3 = 1 and t1.p2 = 1 order by p1 desc) t2
cross apply (select top 1 p1 p22 from #t where p1 > t1.p1 and p3 = 1 and t1.p2 = 1  order by p1 desc) t3) t2
on t1.p1 >= p11 and t1.p1 < p22


Спасибо! Только у меня этих #t values может быть несколько тысяч и число плавающее

выделенное уберите
23 май 14, 14:39    [16061672]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
declare @t table (Pole1 varchar(10), Pole2 varchar(10), Pole3 varchar(10));
insert into @t
values
('Znach1', '0K', '1S'),
('Znach2', '0K', '2S'),
('Znach3', '0K', '1S'),
('Znach4', '0K', '2S'),
('Znach5', '1K', '2S'),
('Znach6', '0K', '2S'),
('Znach7', '0K', '1S'),
('Znach8', '0K', '2S');

select
 t2.*
from
 @t t1 cross apply
 (select top (1) Pole1 from @t where Pole1 < t1.Pole1 and Pole3 = '1S' order by Pole1 desc) a(Pole1) cross apply
 (select top (1) Pole1 from @t where Pole1 > t1.Pole1 and Pole3 = '1S' order by Pole1) b(Pole1) join
 @t t2 on t2.Pole1 >= a.Pole1 and t2.Pole1 < b.Pole1
where
 t1.Pole2 = '1K'
order by
 t2.Pole1;
23 май 14, 14:40    [16061680]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
LisSp
Member

Откуда:
Сообщений: 186
Спасибо!!! Попробую!
23 май 14, 14:43    [16061706]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
CROSS APLLY или OUTER APPLY

если надо проаггрегировать только, а не выводить поля, то есть конструкция UNBOUNDED PRECEDING ROWS -- см MSDN
23 май 14, 14:45    [16061722]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
LisSp,


declare  @t table (p1 int, p2 int, p3 int)
insert @t values (1,0,1),(2,0,2),(3,0,1),(4,0,2),(5,1,2),(6,0,2),(7,0,1),(8,0,2)
insert @t values (9,1,2),(10,0,2),(11,0,1)

select t1.* from @t t1 join
(select p11,p22 from 
@t t1 
cross apply (select top 1 p1 p11 from @t where p1 < t1.p1 and p3 = 1 and t1.p2 = 1 order by p1 desc) t2
cross apply (select top 1 p1 p22 from @t where p1 > t1.p1 and p3 = 1 and t1.p2 = 1 order by p1) t3) t2
on t1.p1 >= p11 and t1.p1 < p22

так?
p1 p2 p3 блок
3 0 1 первый блок
4 0 2
5 1 2
6 0 2
7 0 1 второй блок
8 0 2
9 1 2
10 0 2
23 май 14, 14:45    [16061727]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных по нестандартным условиям  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
a_voronin
CROSS APLLY или OUTER APPLY

если надо проаггрегировать только, а не выводить поля, то есть конструкция UNBOUNDED PRECEDING ROWS -- см MSDN
у автора 2008R2
23 май 14, 14:46    [16061746]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить