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

Откуда: Novosibirsk
Сообщений: 22
Прошу прощения, ибо скорей всего, решение очень простое, но не дается оно мне...

Таблица (T1)
sample_id element_id average
112.5
1211
130.0233
212.1
2223.033


Из нее нужно выбрать только sample_id по условиям, содержащихся в таблице T2:
element_id low high
123
21012


Попробую сформулировать запрос:
Нужно получить все sample_id из T1, для которых average указанного element_id лежит между low и high
Какие element_id нужно проверять и их low и high - в таблице T2

Поясню еще: для приведенных выше условий запрос должен вернуть
sample_id
1


sample_id = 2 не проходит, потому что для его elemet_id = 2 average = 23.033 не лежит между 10 и 12

но, скажем, если запись для element_id = 2 Т2 будет другая:
element_id low high
123
21030


то запрос вернет
sample_id
1
2
19 фев 14, 07:55    [15586892]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
???
select
	t1.sample_id
from T1 t1
join T2 t2 on t1.element_id = t2.element_id
group by t1.sample_id
having min(t1.average) >=  min(t2.low)
	and max(t1.average) <= max(t2.high)


Сообщение было отредактировано: 19 фев 14, 08:21
19 фев 14, 08:20    [15586925]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Vanovich
Member

Откуда: Novosibirsk
Сообщений: 22
Спасибо, такой оперативности не ожидал...
Но результат не тот, скорей всего оттого что формулировка не совсем ясная. Проблема в том, что четко сформулировать ее сам не могу, если б мог - сам бы запрос реализовал.
Почему не тот результат - если Т2 будет такой:
element_id low high
123
2100200

то запрос должен вернуть null, ибо ни для первого ни для второго sample_id нет такого average для element_id=2 которое лежало бы от 100 до 200
19 фев 14, 08:45    [15586970]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну... вот с предоставления тестовых данных и желаемого результата и надо бы начинать.
Причем, желательно не в табличном виде, а в виде скриптов создания таблиц и их заполнения тестовыми данными.
Ну, а, как известно, в правильной постановке задачи лежит половина ответа на неё. ;-)
19 фев 14, 08:49    [15586978]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
aleks2
Guest
Тредстартер требует такой элементарщины, что аксакалы пасуют.

select
	t1.sample_id
from T1 t1
join T2 t2 on t1.element_id = t2.element_id and t1.average between t2.low and t2.high
19 фев 14, 09:41    [15587192]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
select
    t2.sample_id
  from t2
  where exists(select * 
                 from t1 
                 where t1.element_id = t2.element_id 
                   and t1.average between t2.low and t2.high)
19 фев 14, 10:10    [15587407]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Vanovich
Member

Откуда: Novosibirsk
Сообщений: 22
Не торопись с выводами, аксакал. По рекомендации tpg привожу скрипты с тестовыми данными:

declare @T1 table (sample_id int, element_id int, average float);
insert into @T1 values (1,1,2.5);
insert into @T1 values (1,2,11);
insert into @T1 values (1,3,0.0233);
insert into @T1 values (2,1,2.1);
insert into @T1 values (2,2,23.033);

declare @T2 table (element_id int, low float, high float);
insert into @T2 values (1,2,3);

insert into @T2 values (2,10,12) -- вариант 1;
--insert into @T2 values (2,10,30) -- вариант 2;
--insert into @T2 values (2,20,30) -- вариант 3;
--insert into @T2 values (2,100,200) -- вариант 4;


Раскоменнтировав соответствующий вариант и закомментировав остальные получим
+ Желаемые результаты

вариант 1
sample_id
1

вариант 2
sample_id
1
2

вариант 3
sample_id
2

вариант 4
sample_id

19 фев 14, 10:14    [15587432]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Vanovich,
а чем sample_id = 2
insert into @T1 values (2,1,2.1);


не угодил по условию
insert into @T2 values (1,2,3);

и куда делся sample_id=1 в 3 и 4 вариантах?
19 фев 14, 10:27    [15587556]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Vanovich
Member

Откуда: Novosibirsk
Сообщений: 22
Условию
insert into @T2 values (1,2,3);

он угодил. Но должен еще угодить и условию по element_id = 2
По этой же причине sample_id = 1 отсутствует в вариантах 3 и 4, потому что его его average для element_id = 2
не попадает в диапазоны low-high таблицы T2
19 фев 14, 10:34    [15587613]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Vanovich
Member

Откуда: Novosibirsk
Сообщений: 22
Т.е выбираться должны те записи из T1 которые попадают под ВСЕ СРАЗУ условия из T2
19 фев 14, 10:40    [15587671]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
invm
Member

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

То, что вам нужно называется "реляционное деление".
19 фев 14, 10:46    [15587707]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
select 
    t1.sample_id
  from @T1 as t1
  join @T2 as t2 on t2.element_id = t1.element_id 
                and t1.average between t2.low and t2.high
  group by t1.sample_id
  having count(*) = (select count(*) from @t2)
19 фев 14, 11:23    [15588012]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на выборку  [new]
Vanovich
Member

Откуда: Novosibirsk
Сообщений: 22
Bator,
Кажется, работает. По тестовым данным - точно.
Спасибо большое, буду разбираться как он работает.
19 фев 14, 11:37    [15588151]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить