Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Вниз

Хранимая процедура   Найти похожие ветки 

 
ANB   (2008-06-17 22:28) [40]


> Они обе ОЧЕНЬ большие.

Скока миллионов записей ?


 
ANB   (2008-06-17 22:34) [41]


select
 /*+ full(T1) full(T2) parallel(T1,4) parallel(T2,4) use_hash(T1,T2) */
 distinct
 T1.поле1
,T1.поле2
from
 табл1 T1
,табл2 T2
where
   табл2.поле1 = табл1.поле1
and табл2.поле2 = 0


Если я правильно перевел условие, то так должно работать.
Если в каждой таблице по миллиону записей, то у меня отработало за 5 мин.


 
ЮЮ ©   (2008-06-18 06:13) [42]

> [37] Knight ©   (17.06.08 13:03)
>
> Когда показания второго нулевые, то показания первого точнее.


Но когда показания второго ненулевые, их вообще нет в выборке.

И все-таки, что ты хочеь получить теперь, когда стало понятно, что в таблицы пишутся показания с двух датчиков, причём не зависимо друг от друга.

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

З.Ы. Я веду это к тому, что цикл по курсору, ИМХО будет быстрее и «прозрачее», чем EXISTS и агрегирующие подзапросы.


 
Knight ©   (2008-06-18 08:29) [43]

> [41] ANB   (17.06.08 22:34)
> табл2.поле1 = табл1.поле1

Нет там равенства полей :(


 
Knight ©   (2008-06-18 08:34) [44]

> [42] ЮЮ ©   (18.06.08 06:13)

Какая структура организует цикл в sql?


 
ANB   (2008-06-18 10:21) [45]

В результирующий набор данных должны попасть строки из табл1 для которых табл1.поле1=табл2.поле1 AND табл2.поле2=0 ... или табл1.поле1 попадает в интервал значений табл2.поле1 такой, что хотя бы один из них имеет табл2.поле2=0

???


 
Knight ©   (2008-06-18 10:26) [46]

> [45] ANB   (18.06.08 10:21)
> или табл1.поле1 попадает в интервал значений табл2.поле1
> такой, что хотя бы один из них имеет табл2.поле2=0

или табл1.поле1 попадает в интервал значений табл2.поле1 такой, что хотя бы один из них имеет табл2.поле2=0


 
ANB   (2008-06-18 10:32) [47]


> или табл1.поле1 попадает в интервал значений табл2.поле1
> такой, что хотя бы один из них имеет табл2.поле2=0

Переведи. Как определить интервал (я так понял это between ?), если подходящих значений табл2.поле1 15 ?

Если же вопрос стоит так : выбрать все записи из табл1, у которых табл1.поле1 входит в набор табл2.поле1 при табл2.поле2=0
то запрос выглядит так :


select
T1.поле1
,T1.поле2
from
табл1 T1
where
  табл1.поле1 in
(
selecty табл2.поле1
from табл2 T2
where табл2.поле2 = 0
)


Но такой запрос при больших таблицах будет довольно медленным. Мой делает тоже самое, но быстрее.


 
Knight ©   (2008-06-18 10:40) [48]

> [47] ANB   (18.06.08 10:32)

поле1 в табл1 и табл2 практически не имеет общих значений... интервалы занесения показаний датчиков разные. Надо отловить только те показания первого датчика во время снятия которых значения второго были нулевые.


 
ЮЮ ©   (2008-06-19 10:15) [49]

>
> [0] Knight ©   (17.06.08 09:01)
> Помогите осознать логику процедуры, которая должена сделать
> выборку из двух таблиц.


Через 3 с половиной часа телепетор уловил мысль. Автор продолжает «шифроваться»

> [34] ЮЮ ©   (17.06.08 12:38)
> Хочется
> «проредить» table1, оставив те записи, пока взведен флаг
> «в table2 все ещё стоит 0»



Телепатор перегревается и требует подтверждений своих догадок


> [42] ЮЮ ©   (18.06.08 06:13)
> ты хочешь получить только
> те показания первого, когда показания второго уже нулевые
> или станут нулевыми при следующем измерении?


Через сутки автор сдается

> [48] Knight ©   (18.06.08 10:40)
> Надо отловить
> только те показания первого датчика во время снятия которых
> значения второго были нулевые.


И это свои, не один год здесь обитающие. А мы ещё от новичков чего-то требуем.

Теперь по subj-у. Где-то так:

CREATE FUNCTION GetBlaBla(
@ObjID INT,
@TimeStart datetime,
@TimeEnd datetime
)
RETURNS @Result TABLE(ttime datetime, v1 int) AS
BEGIN

 DECLARE c1 CURSOR LOCAL FOR
   SELECT ttime, v1 FROM T1 WHERE ttime BETWEEN @TimeStart AND @TimeEnd
 OPEN c1

 DECLARE c2 CURSOR LOCAL FOR
   SELECT ttime, v2 FROM T2 WHERE ttime BETWEEN @TimeStart AND @TimeEnd
 OPEN c2

 DECLARE @t2Before datetime, @v2Before int
 DECLARE @t2After  datetime, @v2After int
 DECLARE @t1  datetime, @v1 int

 FETCH NEXT FROM c2 INTO @t2After, @v2After
 IF @@FETCH_STATUS = —1 BEGIN
   —— нет показаний в t2
   INSERT INTO @Resul
     SELECT ttime, v1 FROM T1 WHERE ttime BETWEEN @TimeStart AND @TimeEnd
   RETURN
 END

 SET @v2Before = 0
 FETCH NEXT FROM c1 INTO @t1, @v1
 WHILE @@FETCH_STATUS <> &#151;1 BEGIN
   IF @@FETCH_STATUS = 0 BEGIN
     &#151;&#151; продвинемся по T2 до тех пор, пока не достигнем того, что
     &#151;&#151; текущая запись добавлена не позже, а предудущая раньще времени записи в T1

     WHILE @t2After < @t1 BEGIN
       SET @t2Before = @t2After
       SET @v2Before = @v2After  
       FETCH NEXT FROM c2 INTO @t2After, @v2After
       IF @@FETCH_STATUS = &#151;1 BEGIN
         &#151;&#151; считаем, что до конца периода стоит 0
         SET @t2After = @TimeEnd + 0.01
         SET @v2After = 0
       END
     END

     IF (@v2After = 0) OR (@v2Before = 0)
       INSERT INTO @Resul SELECT @t1, @v1

     FETCH NEXT FROM c1 INTO @t1, @v1
   END
 END
 RETURN
END


 
ANB   (2008-06-19 18:49) [50]


> Надо отловить только те показания первого датчика во время
> снятия которых
значения второго были нулевые.


Вот это условие мона расшифровать поподробнее ? И я совершенно не пронаблюдал интервалов. Есть только точки.

Я бы понял задачу так :

Нужно вывести все значения таблицы2 (показаний второго датчика). Если же какое то значение поля "Показание датчика" таблицы2 равно 0, то заменить его соответствующим значением из таблицы1, причем найти в ней строку, ближайщую по времени (Т1.поле1) к времени измерения второго датчика (Т2.поле1).

Так ?


 
Knight ©   (2008-06-19 22:11) [51]

> [49] ЮЮ ©   (19.06.08 10:15)

Спасибо, завтра погляжу.. чёт сёдня приболел.


 
ЮЮ ©   (2008-06-20 04:12) [52]

> [51] Knight ©   (19.06.08 22:11)
> Спасибо, завтра погляжу&#133 чёт сёдня приболел.


Не забудь в SELECT-ах курсоров &#133 AND(ObjID = @ObjID) ORDER BY  ttime



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.048 c
2-1213704407
tey
2008-06-17 16:06
2008.07.20
работа со строкой


2-1212575484
TUserClass
2008-06-04 14:31
2008.07.20
Проблема с тулбаром для IE ...


3-1202477060
harisma
2008-02-08 16:24
2008.07.20
Количество подключений к базе данных


2-1214065057
Tom
2008-06-21 20:17
2008.07.20
Имя пользователя


15-1212653170
ahp
2008-06-05 12:06
2008.07.20
Что это за -J option





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский