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

Откуда:
Сообщений: 18
Добрый вечер всем :) Прошу вашей помощи ибо сам не могу докумекать)
У меня есть таблица TestR с полями Data и IdV
IdV принимает значения 1 или 0, мне нужно чтобы отображались данные по периодам, когда IdV равен 0.

примерчик
Таблица TestR

Data IdV id
2012-01-01 00:00:00.000 1 333
2013-01-12 23:00:00.000 0 333
2013-03-25 00:00:00.000 1 333

таблица TestB
Data2 Num id_c
04.01.2013 12:48:00 11111111 333
13.01.2013 22:44:00 11111111 333
23.01.2013 11:29:00 11111111 333
09.02.2013 6:15:14 11111111 333
22.02.2013 11:00:00 11111111 333
12.03.2013 22:33:00 11111111 333
18.03.2013 16:47:40 11111111 333
02.04.2013 18:03:40 11111111 333

Должно получиться вот так

04.01.2013 12:48:00 11111111 333
02.04.2013 18:03:40 11111111 333

То есть отсеялись даты, в период пока снова не стала единичка =))) Таблицы соединил, как условие прописать хз(
4 апр 13, 19:36    [14137578]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Edkonst2008
Member

Откуда:
Сообщений: 503
Не периоды наверное...
Результатом должно быть попадание значений из таблицы TestB по некоторому условию из таблицы TestR?
Сформулируйте вначале это условие...
4 апр 13, 20:29    [14137739]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Результатом должно получится отсеивание данных из таблицы TestB )))))))
4 апр 13, 20:39    [14137772]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
select b.* 
from (
   select id,Data,Data2
   from TestR r
   outer apply (select MIN(Data)Data2 from TestR where IdV=0 and Data>r.Data ) c
   where r.IdV=1
   )r
join TestB b on b.id_c=r.id and b.Data2>=r.Data and (r.Data2 is null or b.Data2<=r.Data2)
4 апр 13, 20:58    [14137831]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Cygapb-007
select b.* 
from (
   select id,Data,Data2
   from TestR r
   outer apply (select MIN(Data)Data2 from TestR where IdV=0 and Data>r.Data ) c
   where r.IdV=1
   )r
join TestB b on b.id_c=r.id and b.Data2>=r.Data and (r.Data2 is null or b.Data2<=r.Data2)


Спасибо, буду смотреть и пробовать ))) Есть хорошие люди на этой планете )))
4 апр 13, 21:12    [14137863]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Что то нихрена не получилось) А нет варианта попроще)
5 апр 13, 09:12    [14138600]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Valera777
нихрена не получилось

Это сообщение об ошибке от SQL Server?
5 апр 13, 10:46    [14138907]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Добрый Э - Эх
Guest
Valera777,

что именно не получилось? Или сервер так и сказал: "Ох, нихрена же себе запросик... А попроще ничего нет?" ?
5 апр 13, 10:46    [14138908]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Добрый Э - Эх
Guest
а вообще, если версия сервера позволяет, то я бы на lead/lag over() заморочился бы... На них решение будет наиболее интуитивно понятным и прозрачным...
5 апр 13, 10:48    [14138925]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Да не ребят sql сервер пока так не говорит) Я структуру посмотрел, чето тяжко в пятницу ))) Может че попроще, какой вариант есть?
Промежутки сверить то вроде не так сложно, я когда таблицы связал, он как то через (_)*(_) стало вообще) Я то думал просто связать, потом исключить 0 и сравнивать даты) сам до окнца не врубился, что написал) Просто может есть проще мысль и метод как это сделать)
5 апр 13, 11:09    [14139062]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Glory
Member

Откуда:
Сообщений: 104760
Valera777
Может че попроще, какой вариант есть?

select 1
Valera777
росто может есть проще мысль и метод как это сделать)

Вас количество слов в запросе смущает что ли ?
5 апр 13, 11:16    [14139108]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Нет, дело в том, что у меня есть четкий пример

Таблица TestR

Data IdV id
2012-01-01 00:00:00.000 1 333
2013-01-12 23:00:00.000 0 333
2013-03-25 00:00:00.000 1 333

таблица TestB
Data2 Num id_c
04.01.2013 12:48:00 11111111 333
13.01.2013 22:44:00 11111111 333
23.01.2013 11:29:00 11111111 333
09.02.2013 6:15:14 11111111 333
22.02.2013 11:00:00 11111111 333
12.03.2013 22:33:00 11111111 333
18.03.2013 16:47:40 11111111 333
02.04.2013 18:03:40 11111111 333

Должно получиться вот так

04.01.2013 12:48:00 11111111 333
02.04.2013 18:03:40 11111111 333

Здесь же выдает пустоту :( указал когда указал id =333
5 апр 13, 14:38    [14140649]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
а еще ругается вот здесь b.Data2<=r.Data2 не удалось найти хранимую процедуру!
5 апр 13, 14:42    [14140682]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Valera777,

у вас версия сервера ваще какая ?
5 апр 13, 14:44    [14140695]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
2008 :) Ошибку подправил, результат тот же(((
5 апр 13, 14:48    [14140724]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Valera777
2008 :) Ошибку подправил, результат тот же(((
PRINT @@VERSION
что возвращает?
5 апр 13, 15:17    [14140923]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Microsoft SQL Server 2008
5 апр 13, 15:44    [14141126]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
Valera777
Microsoft SQL Server 2008
Скопипастить было нельзя?
5 апр 13, 15:46    [14141140]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
iap
Valera777
Microsoft SQL Server 2008
Скопипастить было нельзя?


можно и скопипастить

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Evaluation Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
5 апр 13, 15:50    [14141165]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Сорри, уезжал по делам...
+ тот же скрипт с такими же тестовыми данными
;with 
TestR as (select * from(values
   ('2012-01-01 00:00', 1, 333),
   ('2013-01-12 23:00', 0, 333),
   ('2013-03-25 00:00', 1, 333)
	)t(Data, IdV, id)),
TestB as (select * from(values
   ('04.01.2013 12:48:00', 11111111, 333),
   ('13.01.2013 22:44:00', 11111111, 333),
   ('23.01.2013 11:29:00', 11111111, 333),
   ('09.02.2013 06:15:14', 11111111, 333), 
   ('22.02.2013 11:00:00', 11111111, 333),
   ('12.03.2013 22:33:00', 11111111, 333),
   ('18.03.2013 16:47:40', 11111111, 333),
   ('02.04.2013 18:03:40', 11111111, 333)
	)t(Data2,Num,id_c))
select b.* 
from (
   select id,Data,Data2
   from TestR r
   outer apply (select MIN(Data)Data2 from TestR where IdV=0 and Data>r.Data ) c
   where r.IdV=1
   )r
join TestB b on b.id_c=r.id and b.Data2>=r.Data and (r.Data2 is null or b.Data2<r.Data2)
where id_c=333
Data2Numid_c
23.01.2013 11:29:0011111111333
22.02.2013 11:00:0011111111333
В чем ошибка-то? в привязке к реальным таблицам?
5 апр 13, 16:49    [14141594]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
ээ... с конвертацией дат напутал...
5 апр 13, 16:51    [14141608]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
+
set dateformat dmy
;with 
TestR as (select * from(values
   (convert(date,'01.01.2012 00:00'), 1, 333),
   ('12.01.2013 23:00', 0, 333),
   ('25.03.2013 00:00', 1, 333)
	)t(Data, IdV, id)),
TestB as (select * from(values
   (convert(date,'04.01.2013 12:48:00'), 11111111, 333),
   ('13.01.2013 22:44:00', 11111111, 333),
   ('23.01.2013 11:29:00', 11111111, 333),
   ('09.02.2013 06:15:14', 11111111, 333),
   ('22.02.2013 11:00:00', 11111111, 333),
   ('12.03.2013 22:33:00', 11111111, 333),
   ('18.03.2013 16:47:40', 11111111, 333),
   ('02.04.2013 18:03:40', 11111111, 333)
	)t(Data2,Num,id_c))
select b.* 
from (
   select id,Data,Data2
   from TestR r
   outer apply (select MIN(Data)Data2 from TestR where IdV=0 and Data>r.Data ) c
   where r.IdV=1
   )r
join TestB b on b.id_c=r.id and b.Data2>=r.Data and (r.Data2 is null or b.Data2<r.Data2)
where id_c=333
Data2Numid_c
2013-01-04 00:00:00.00011111111333
2013-04-02 00:00:00.00011111111333
5 апр 13, 16:54    [14141641]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Cygapb-007
+
set dateformat dmy
;with 
TestR as (select * from(values
   (convert(date,'01.01.2012 00:00'), 1, 333),
   ('12.01.2013 23:00', 0, 333),
   ('25.03.2013 00:00', 1, 333)
	)t(Data, IdV, id)),
TestB as (select * from(values
   (convert(date,'04.01.2013 12:48:00'), 11111111, 333),
   ('13.01.2013 22:44:00', 11111111, 333),
   ('23.01.2013 11:29:00', 11111111, 333),
   ('09.02.2013 06:15:14', 11111111, 333),
   ('22.02.2013 11:00:00', 11111111, 333),
   ('12.03.2013 22:33:00', 11111111, 333),
   ('18.03.2013 16:47:40', 11111111, 333),
   ('02.04.2013 18:03:40', 11111111, 333)
	)t(Data2,Num,id_c))
select b.* 
from (
   select id,Data,Data2
   from TestR r
   outer apply (select MIN(Data)Data2 from TestR where IdV=0 and Data>r.Data ) c
   where r.IdV=1
   )r
join TestB b on b.id_c=r.id and b.Data2>=r.Data and (r.Data2 is null or b.Data2<r.Data2)
where id_c=333
Data2Numid_c
2013-01-04 00:00:00.00011111111333
2013-04-02 00:00:00.00011111111333


Спасибо, к сожалению сейчс не имею возможности проверить( Немного не понятно как структуру присобачить в свою)
with cte as
(  select id_c, Data2, Code,Data, IdV,  

  row_number() over(partition by id_c order by Data2) as rn
   inner join TestR on id_c=id
   
   where Data2 between '20130101'and '20130403'  
	
and id_c= '50002963'
  
) 
7 апр 13, 11:43    [14146778]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Valera777
Member

Откуда:
Сообщений: 18
Люди HELP :) Оч надо)
8 апр 13, 09:05    [14149538]     Ответить | Цитировать Сообщить модератору
 Re: Отбор периода  [new]
Scherbakov
Member

Откуда: Нижний Новгород
Сообщений: 82
Valera777,

Так вон же готовое решение выше уже несколько раз выложили. Чем не нравится?
8 апр 13, 09:15    [14149561]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить