powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на обновление: замена заданного числа на соседнее по условию
23 сообщений из 23, страница 1 из 1
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692120
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CO	Extension	Transfer	Number
 12 	 104 				 83252222222 
 12 	 369 		*		 83252222222 
 6 	 108 				 83259999999 
 8 	 104 				 83001234567 
 22 	 116 				 83007654321 
 6 	 369 		*		 83259999999 
 15 	 137 				 09 
 22 	 369 		*		 83009876543 
 19 	 137 				 09 
Как видно, это логи АТС
Около Extension: 369 всегда стоит звездочка — подтверждает, что это "трансфер звонка".

Задача: 369 поменять на номер Extension, у которого совпадает CO и Number, причем он должен быть
а) выше по списку
б) первый совпавший

То есть в примере надо заменить 369 во второй строке на 104, в шестой строке на 108, а в восьмой — не менять вовсе.

Возможно ли это сделать одним запросом? Естественно, хочется избежать функций типа Iif, чтобы ускорить процесс.

Платформа — Acc'XP.
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692153
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как всегда - в таких задачах мой первый вопрос

Как определяется порядок строк (упорядочивающий критерий есть?)

Т.е. в вашем примере первая строка не отличается от второй (пардон) ни чем
Как Акс должен определить какая строка "выше"
Сразу предупрежу ваш ответ - типа: порядок строк определяется порядком их появления в таблице (дык - это не есть правильный ответ, ибо мы этим воспользоваться не можем, впрочем так же как и Акс)
Вам надо либо упорядоченный счетчик иметь или дату, по которым и будем определять, что выше :)
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692226
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
порядок строк определяется порядком их появления в таблице — я так и не собирался говорить

Скажем так — в процессе конвертации данных из текстового файла добавлю к ней поле Counter.
Хотя, когда пример писал, имел в виду сортировку по полю iDate (datetime) — но почему-то не включил в пример. бес попутал...
Да собсно, все равно. Будем считать что поле для однозначной сортировеки есть, пусть будет Counter
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692239
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. в результате должно быть:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CO	Extension	Transfer	Number
 12 	 104 				 83252222222 
 12 	 104 		*		 83252222222 
 6 	 108 				 83259999999 
 8 	 104 				 83001234567 
 22 	 116 				 83007654321 
 6 	 108 		*		 83259999999 
 15 	 137 				 09 
 22 	ххх		*		nnnnnnnnnnn
 19 	 137 				 09 
?
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692256
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, должно остаться без изменений
Код: plaintext
1.
 22 	 369 		*		 83009876543 
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692270
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT ...
FROM tabl t1 LEFT JOIN tabk t2 ON t1.CO=t2.Co AND t2.Transfer IS NULL AND t1.Transfer="*"
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692284
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
update t inner join t AS t1 on (t.number = t1.Number) AND (t.CO = t1.CO) AND (t.Extension <> t1.Extension)
set t.Extension = t1.Extension
where t.Transfer="*";

Только тут я беру первый попавшийся, а не первый по списку. А обязательно первый по списку? ;))
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692294
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictoshaSELECT ...
FROM tabl t1 LEFT JOIN tabk t2 ON t1.CO=t2.Co AND t2.Transfer IS NULL AND t1.Transfer="*"
1) это было без условия на номер.
2) Выше по списку - надо бы "нумеровать" чем-то
в итоге что надо - выборка или update исходной таблицы?
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692296
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
обязательно... на этом и загвоздка...
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692299
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВыше по списку - надо бы "нумеровать" чем-то
Добавили же поле Counter? чтоб по нему сортировать.
Нужен именно Update
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692317
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть?

Geoupdate t inner join t AS t1 on (t.number = t1.Number) AND (t.CO = t1.CO) AND t1.counter IN (Select MIN(counter) From t as t3 WHERE
(t3.number = t1.Number) AND (t3.CO = t1.CO) AND AND t3.Transfer IS NULL
AND (t.Extension <> t1.Extension)

)

set t.Extension = t1.Extension
where t.Transfer="*";

<///>;))
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692335
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cо вложенными он ругается на "обновляемый запрос". Не могу обойти. На ум приходит только двойной dlookup но это совсем плохо. М.б. все-таки какая-нибудь временная таблица?..
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692366
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у тебя ругается, а у меня вообще вылетает с приветом Биллу...
сервиспаки стоят.

Да и потом, есть у меня ощущения, что запрос поменяет все "трансфер=*" на первый найденный правильный екстеншн. Или нет?
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692403
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, зачем же... Сейчас dmin/dlookup попробую, но, имхо, лучше посредством доп. таблицы/записей.
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692414
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, тогда буду дополнительные таблицы ваять.
Спасибо всем откликнувшимся!
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692422
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погоди, вот:

UPDATE t, t as t1
SET t.Extension = t1.extension

WHERE
t.Transfer="*" AND
t1.cntr=nz(DMin("cntr","t","co=" & t.CO & " and len(nz(Transfer))=0 and number='" & t.number & "'"),0);
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32692433
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
, где cntr - счетчик, а number - текстовое поле
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32740322
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
маленький ап

как можно это еще и убыстрить?

дело в том, что я человек, так сказать, измученный нарзаном.
Устал ждать

на ~100 записей — ~ 3 секунд
на ~8000 записей (смешно сказать) — не знаю сколько секунд, ни разу не смог дождаться...


что такое индексы, я не знаю, но предполагаю, что надо сделать какие-то поля индексированными. Так ли это? и если да, то какие?

В данный момент индексированы поля Код (cntr в примере Geo), Extension, transfer и number


Кстати, действует ли индексированность на скорость работы DMin?
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32740797
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можешь на мыло прислать мне тестовую табличку записей на 1000-5000?
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32740909
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, только в понедельник — в Астане рабочий день закончился.
Спасибо заранее.

Кстати, оставляю запрос выполняться на сервере, на все выходные.




//Знали бы вы, какой каторжный труд делать это все вручную!
//Нуф-style comment ©Непомнючьё
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32741076
htrjhlctnjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй обрезать количество записей в произведении (до WHERE):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
UPDATE t INNER JOIN t AS t1
ON
   (t1.cntr)<[t].[cntr] 
 AND
    ((t1.Transfer) Is Null Or (t1.Transfer)= '')   
 AND
  (t.Transfer)= '*' 

 SET t.Extension = t1.extension
 
WHERE 
(t1.cntr)=nz(DMin('cntr','t',"co=" & [t].[CO] & " and ((t.Transfer Is Null) Or (t.Transfer='') ) and [number]='" & [t].[number] & " ' "), 0 )
не утверждаю, что поможет. (предпочитаю такие задачи в Аксесе решать в рекордсете - нормальный SQL он тут не понимает - а то было бы так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
UPDATE t  
SET 
t.extension = (
SELECT TOP  1  t1.extension
 FROM  t AS t1
 WHERE
   (t1.cntr)<t.cntr 
 AND
    ((t1.Transfer) Is Null Or (t1.Transfer)= '')   
 ORDER BY cntr DESC
) 
WHERE (((t.Transfer)= '*')); 
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32741545
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо было сразу временными таблицами делать.
Cделал временную таблицу tt (mId long, CO int, number text).
Первичный ключ - СО + number.

Сделал тестовую таблицу на 10000 записей. Запрос с DMIN умер.
Вместо него вызываются три других:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 ' 1) 
On Error Resume Next
currentdb.execute "delete * from tt"
On Error GoTo  0 
 ' 2) 
currentdb.execute "query1"
 ' 3) 
currentdb.execute "query2"
У меня отработало мгновенно.
Можно немного по-другому, чтоб тестовая таблица не болталась в списке:
Код: plaintext
1.
2.
3.
4.
5.
6.
 ' 1) 
currentdb.execute "query1-1"
 ' 2) 
currentdb.execute "query2"
 ' 3) 
currentdb.tabledefs.delete "tt"

Query1:
Код: plaintext
1.
2.
3.
4.
5.
6.
insert		into tt (mId, CO, [number])
select		Min(t.id), t.CO, t.number
from		tCalls as t
		INNER JOIN tCalls AS t1 ON (t.CO = t1.CO) 
		                           AND (t.number = t1.number)
where		t1.transfer = '*' and (t.transfer='' or t.transfer is null)
group by 	t.CO, t.number

Query2:
Код: plaintext
1.
2.
3.
4.
UPDATE	(tCalls as t 
	 INNER JOIN tCalls AS t1 ON (t.CO = t1.CO) AND (t.number = t1.number))
	 INNER JOIN tt ON t1.id = tt.mId
SET	t.transfer = "", t.ext = t1.ext
WHERE   t.transfer='*'

Query1-1:
Код: plaintext
1.
2.
3.
4.
5.
6.
select		Min(t.id), t.CO, t.number
Into		tt
from		tCalls as t
		INNER JOIN tCalls AS t1 ON (t.CO = t1.CO) 
		                           AND (t.number = t1.number)
where		t1.transfer = '*' and (t.transfer='' or t.transfer is null)
group by 	t.CO, t.number
...
Рейтинг: 0 / 0
Запрос на обновление: замена заданного числа на соседнее по условию
    #32743056
Фотография funddd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo!
Буду в Москве, с меня пиво.

//еще раз убедился в том, что форум мне вреден. Мог сам додуматься, но заломало.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на обновление: замена заданного числа на соседнее по условию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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