powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Данные нескольких записей в запросе
20 сообщений из 20, страница 1 из 1
Данные нескольких записей в запросе
    #37477326
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть следующая таблица:
Дата торгов Torg_date, Код фьючерса Name, Показатель R, Показатель N

Необходимо рассчитать показатель N для каждой записи:
Nk=ln(Rk(i)-Rk(i-2), где i - порядковый номер торгового дня

Не знаю как взять значения Rk(i-2) при расчете.

В таблице хранятся данные о разных фьючерсах, каждый торговался за день один раз
Таблица отсортирована по дате торгов

Как можно рассчитать N?
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477382
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще надо быть :) пример заполненной таблицы покажи.

Torg_date минус какая-то постоянная дата не подойдет?
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477420
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример заполненной таблицы

Torg_date Name N R
05.02.1996 21057–1602 0.00 0.00153
05.02.1996 22020–1602 0.00 0.00162
05.02.1996 22020–1503 0.00 0.00159
05.02.1996 22020–1904 0.00 0.00156
06.02.1996 21057–1602 0.00 0.00150
06.02.1996 22020–1602 0.00 0.00159
06.02.1996 22020–1503 0.00 0.00159
06.02.1996 22020–1904 0.00 0.00130
07.02.1996 21057–1602 0.00 0.00152
07.02.1996 22020–1602 0.00 0.00160
07.02.1996 22020–1503 0.00 0.00159
07.02.1996 22020–1904 0.00 0.00131
08.02.1996 21057–1602 0.00 0.00142
08.02.1996 22020–1602 0.00 0.00155
08.02.1996 22020–1503 0.00 0.00154
08.02.1996 22020–1904 0.00 0.00124
09.02.1996 21057–1602 0.00 0.00143
09.02.1996 22020–1602 0.00 0.00156
09.02.1996 22020–1503 0.00 0.00157
09.02.1996 22020–1904 0.00 0.00124

Dima TTorg_date минус какая-то постоянная дата не подойдет?
Нет

По-другому объяснить что нужно не смог)
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477600
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alebezh,

а результаты? Например, для записи
Код: plaintext
07.02.1996 21057–1602 0.00 0.00152
что и как должно посчитаться?
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477696
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tangliralebezh,

а результаты? Например, для записи
Код: plaintext
07.02.1996 21057–1602 0.00 0.00152
что и как должно посчитаться?

N будет равняться LOG(0.00152/0.00153), где 0.00153 - значение R в торговый день, который был на два дня раньше:

Torg_date Name N R
05.02.1996 21057–1602 0.00 0.00153
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477744
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alebezh,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT x.Torg_date, x.Name, x.R, LOG(w.R/y.R) AS N; 
FROM (SELECT Torg_date, Name, R, (SELECT Torg_date FROM tablic z;
WHERE z.Torg_date = t.Torg_date -  2  .AND. z.Name = t.Name) AS parent_date;  
FROM tablic t) x;  
LEFT OUTER JOIN tablic y ;
ON y.Torg_date = x.parent_date AND y.Name = x.Name;  
INTO CURSOR listOut

алгоритм не мой!
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477791
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alextashk, что-то у вас страшное вышло, да ещё и с подзапросами.
Код: plaintext
1.
2.
SELECT x.Torg_date, x.Name, x.R, LOG(x.R/y.R) AS N; 
FROM tablic x join tablic y on x.Torg_date=y.Torg_date+ 2  .AND. x.name=y.name
INTO CURSOR listOut
И легче читается, и работать быстрее будет.
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37477793
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что за загадочная таблица "w" в выражении с логарифмом?
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37479258
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как заполнить значениями из курсора саму таблицу?

В курсоре нет первых записей, потому что для них нет предыдущих, а в таблице должны быть все записи, пусть и с 0 значениями N
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37479323
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT x.Torg_date, x.Name, x.R
, LOG(x.R/nvl(y.R,/*что-то, что должно быть тут, если нет предыдущих записей*/)) AS N; 
FROM tablic x LEFT join tablic y on x.Torg_date=y.Torg_date+ 2  .AND. x.name=y.name
INTO CURSOR listOut
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37479327
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT x.Torg_date, x.Name, x.R, IIF(ISNULL(y.R) OR y.R =  0 ,  0 , LOG(x.R/y.R))+ 000000 . 00000  AS N; 
FROM tablic x 
LEFT OUTER JOIN tablic y on x.Torg_date = y.Torg_date +  2  .AND. x.name=y.name
INTO CURSOR listOut

tangliralextashk, что-то у вас страшное вышло, да ещё и с подзапросами.
И легче читается, и работать быстрее будет.
Я же писал - не мой алгоритм, но спасибо за упрощение алгоритма!
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37479416
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, alextashk

Большое спасибо
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37479521
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значения нужно выбирать по номеру записи, а не по Torg_data-2. Например если рассчитывать для 8 февраля, и нет данных за 6 февраля, то нужно взять значение за 5 февраля:

05.02.1996 21057–1602 0.00 0.00153
07.02.1996 21057–1602 0.00 0.00152
08.02.1996 21057–1602 0.00 0.00142

Как это можно сделать?
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37481255
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alebezh,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT x.Torg_date, x.Name, x.R, IIF(ISNULL(y.R) OR y.R = 0, 0, LOG(x.R/y.R))+000000.00000 AS N; 
FROM (SELECT Torg_date, Name, R, (SELECT MAX(Torg_date) 
                                                  FROM tablic z;
                                                  WHERE z.Torg_date <= t.Torg_date - 2 .AND. z.Name = t.Name) AS parent_date;  
         FROM tablic t) x;  
LEFT OUTER JOIN tablic y ;
ON y.Torg_date = x.parent_date AND y.Name = x.Name;  
INTO CURSOR listOut
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37481259
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, вот так

SELECT x.Torg_date, x.Name, x.R, IIF(ISNULL(y.R) OR y.R = 0, 0, LOG(x.R/y.R))+000000.00000 AS N;
FROM tablic x;
LEFT OUTER JOIN (SELECT Torg_date, Name, R, (SELECT MAX(Torg_date)
FROM tablic z;
WHERE z.Torg_date <= t.Torg_date - 2 .AND. z.Name = t.Name) AS parent_date;
FROM tablic t) y ;
ON y.Torg_date = x.parent_date AND y.Name = x.Name;
INTO CURSOR listOut
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37481272
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-хорошему надо бы ввести в таблицу поле "номер", в котором будет счётчик (для каждого NAME своя последовательность), и делать джойн не по дате+2, а по номеру+2; все остальные решения будут гораздо медленнее имхо.
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37483205
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этот запрос вызывает ошибку "SQL: Error correlating fields":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT x.Torg_date, x.Name, x.R, IIF(ISNULL(y.R) OR y.R =  0 ,  0 , LOG(x.R/y.R))+ 000000 . 00000  AS N; 
FROM tablic x; 
LEFT OUTER JOIN (SELECT Torg_date, Name, R, (SELECT MAX(Torg_date) 
FROM tablic z;
WHERE z.Torg_date <= t.Torg_date -  2  .AND. z.Name = t.Name) AS parent_date; 
FROM tablic t) y ;
ON y.Torg_date = x.parent_date AND y.Name = x.Name; 
INTO CURSOR listOut

Сделал, как предлагал tanglir:

Код: plaintext
1.
2.
 SELECT DISTINCT Torg_date FROM f_zb INTO CURSOR dateb
 SELECT RECNO() AS Num, Torg_date FROM dateb INTO CURSOR daten
 SELECT Num, tmp.Torg_date, tmp.Name, R, Pokaz FROM tmp JOIN daten ON tmp.Torg_date=daten.Torg_date INTO CURSOR numred

Код: plaintext
1.
2.
 SELECT x.Num, x.Torg_date, x.Name, x.R, IIF(ISNULL(y.R) OR y.R =  0 ,  0 , LOG(x.R/y.R))+ 000000 . 00000  AS N; 
 FROM numred x LEFT OUTER JOIN numred y on x.num = y.num +  2  .AND. x.name=y.name;
 INTO CURSOR listOut
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37483353
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alebezh,

tanglir для каждого NAME своя последовательность

А вы даты пронумеровали. И что получится в последней строке, если у вас будут такие данные
Torg_dateName2011-01-0112011-01-0122011-01-0212011-01-0222011-01-0312011-01-0412011-01-0512011-01-0612011-01-062?
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37484240
alebezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,

Каждой дате присвоен свой номер, т.е.:

Код: plaintext
1.
2.
3.
4.
 2011 - 01 - 01          1 
 2011 - 01 - 01 	         1 
 2011 - 01 - 02 	         2 
 2011 - 01 - 02 	         2 

Работает)
...
Рейтинг: 0 / 0
Данные нескольких записей в запросе
    #37484257
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alebezh,

1)почему они у вас дублируются?
2)всё-таки сделайте тестовую таблицу с моими данными и проверьте запрос на ней.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Данные нескольких записей в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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