powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / сделать выборку ОДНИМ селектом
10 сообщений из 10, страница 1 из 1
сделать выборку ОДНИМ селектом
    #33509913
!Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
совсем голову сломал. ниче не лезет.
дано: табла hist со структурой
no - номер счета,
date - дата,
date_hist - дата изменения
надо в одном селекте выбрать все счета, у которых поменялась дата например 01.01.2006
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33509970
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я че-то не понял вопроса.
Код: plaintext
SELECT * FROM hist WHERE hist.date != hist.date_hist
? или че
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33509997
!Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не так.
в табле hist сранится история, что делали со счетом.
на каждый счет несколько строчек. мне надо поле date изменилась по сравнению с предыдущим состоянием. причем у нужного состояния date_hist={01.01.2006}
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33510030
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в транзакт-скуле было бы просто
SELECT * FROM hist a WHERE (SELECT count(*) FROM hist b WHERE b.no=a.no) > 1 AND a.date = {01.01.2006}


в фоксе такое не прокатит
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33510033
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоесть AND a.date_hist = {01.01.2006}
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33510173
!Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я наверно неправильно объясняю. по вашему селекту выйдут все счета, у которых больше чем одно сохранение и есть хотя бы одно с date_hist={01.01.2006}.
мне же надо найти все счета, у которых есть хотя бы одно с date_hist={01.01.2006} у которых в предыдущем сохранении поле date не равно текущему значению поля date
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33511128
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Select-SQL такого понятия, как "последующая/предыдущая" запись не существует. Поэтому при ТАКОЙ постановке задачи Вы вообще ничего не сможете сделать.

Попробуйте сформулировать задачу так:

Найти все записи, у которых date_hist={01.01.2006} и существует запись, отличная от найденной с тем же значением поля "no" и значением поля date={01.01.2006}

Если у этой таблицы есть уникальный идентификатор записи, то такая задача решается достаточно просто:

Код: plaintext
1.
2.
3.
4.
5.
SELECT * ;
FROM hist ;
WHERE hist.date_hist={ 01 . 01 . 2006 } ;
	AND EXISTS(SELECT * FROM hist as hist2 WHERE hist2.no=hist.no ;
		AND hist2.date={ 01 . 01 . 2006 } AND hist2.Id<>hist.id)

Ну, или чуть по другому, для ускорения работы

Код: plaintext
1.
2.
3.
4.
SELECT DISTINCT hist.* ;
FROM hist ;
INNER JOIN hist as hist2 ON hist2.no=hist.no AND hist2.Id<>hist.id ;
WHERE hist.date_hist={ 01 . 01 . 2006 } AND hist2.date={ 01 . 01 . 2006 } 

Здесь поле Id - это как раз тот самый уникальный идентификатор записи.

Если все-таки требуется учитывать именно "порядок следования", то лучше вообще отказаться от Select-SQL и решать эту задачу через SCAN...ENDSCAN с ручным заполнением временной таблицы.

Посмотрите, насколько сложно в Select-SQL решается вопрос определения "порядкового номера"

http://www.sql.ru/faq/faq_topic.aspx?fid=126
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33512194
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я думаю, они не пойдут на создание нового уникального поля Id. старый добрай SCAN будут использовать
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33512215
!Guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо! особенно Владимиру М.
после долгих раздумий я сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select * from 
         (select h1.no,h1.date_hist,h1.DATE from hist h1 
                 where trunc(h1.hist)=to_date('01.01.2006')) w1,
         (select h.* from hist h,
                (select h1.no,min(h1.date_hist) as date_hist from hist h1 
                         where trunc(h1.DATE_hist)>to_date( 01 . 01 . 2006 ') group by h1.no) q1
                      where h.no=q1.no and h.DATE_hist=q1.DATE_hist) w2
where w1.no=w2.no and w1.date<>w2.date

засылаю запрос в оракл, но работает так долго, что от этого пришлось отказатся. значит не судьба, че нить другое придется придумать
...
Рейтинг: 0 / 0
сделать выборку ОДНИМ селектом
    #33514814
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi !Guest!

Исходя из предположения, что комбинация no+date_hist уникальна (т.е. не
может быть в один день двух "изменений" - если может, то надо обеспечить
уникальность дополнительным полем, или просто сменив Date на Datetime), а
также что ОБЯЗАТЕЛЬНО для всех no имеется запись с датой 1.1.2006г. должен
работать такой запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT no ;
 FROM hist h2 ;
 WHERE h2.date_hist = ;
   (SELECT MAX(h1.date_hist) ;
    FROM hist h1 ;
    WHERE h1.date_hist < DATE( 2006 , 1 , 1 ) AND ;
      h1.no = h2.no) AND ;
  date <> ;
   (SELECT date ;
    FROM hist h3 ;
    WHERE h3.no=h2.no AND ;
      h3.date_hist = DATE( 2006 , 1 , 1 ))
Т.е. сначала мы находим запись с "предыдущей датой изменения" для каждого no
(по дате_изменения - максимальной среди всех не превышающих заданной
"текущей" даты_изменения), потом мы выбираем "текущее" значение
сравниваемого атрибута, и сравниваем его с "предыдущим" - если они
отличаются - в выборку попадает no - если они совпали - не попадает.
Тонкое/неочевидное место (но IMHO это вполне корректно) - если в "истории"
только одна запись по некоторому no - она никогда не попадёт в выборку (уже
первый подзапрос её "отсеет") - т.к. нет "предыдущего состояния" - и просто
не с чем сравнивать "текущее".
Конечно если реально в истории нет данных с датой изменения "точно"
1.1.2006г - то придётся усложнить запрос - вместо точного значения
DATE(2006,1,1) в оба подзапроса вставить еще один подзапрос, эта самую дату
вычисляющий (следуя логике, если нету "истории" за 1.1.2006 то нужно взять
наиболее "свежую" из предыдущих).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT no ;
 FROM hist h2 ;
 WHERE h2.date_hist = ;
   (SELECT MAX(h1.date_hist) ;
    FROM hist h1 ;
    WHERE h1.date_hist < ;
     (SELECT MAX(h4.date_hist) ;
      FROM hist h4 ;
      WHERE h4.date_hist <= DATE( 2006 , 1 , 1 ) AND ;
        h4.no = h1.no) AND ;
      h1.no = h2.no) AND ;
  date <> ;
   (SELECT date ;
    FROM hist h3 ;
    WHERE h3.no=h2.no AND ;
      h3.date_hist = ;
       (SELECT MAX(h5.date_hist) ;
        FROM hist h5 ;
        WHERE h5.date_hist <= DATE( 2006 , 1 , 1 ) AND ;
          h5.no = h3.no))
P.S. В фоксе это будет работать начиная с VFP9

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / сделать выборку ОДНИМ селектом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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