Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
Уважаемые знатоки, просит совета человек уже прямоходящий, но пока ещё не Sapiens (хорошо, что начальник об этом не знает)! Необходимо вычислять разницу между smalldatetime по такому принципу: структура таблицы: kamp d_otkl d_podkl srok_mi ele 1 . . : 03.02.1984 15:03 NULL 1 2 02.05.1988 03:00 17.05.1988 06:32 1234567 1 3 03.09.1989 07:59 18.09.1989 23:00 7654321 1 4 12.04.1993 15:26 26.04.1993 08:56 9876543 1 5 21:04.2002 22:12 . . : 1234567 1 Надо Update srok_mi в строке, где kamp=2 разницей (d_otkl из kamp=2)-(d_podkl из kamp=1) Update srok_mi в строке, где kamp=3 разницей (d_otkl из kamp=3)-(d_podkl из kamp=2) Update srok_mi в строке, где kamp=4 разницей (d_otkl из kamp=4)-(d_podkl из kamp=3) ................................................... и т. д. Это безобразие надо делать при заполнении,редакт. задним числом полей d_otkl, d_podkl. Как лучше сделать? С помощью курсоров, или ещё как можно? С курсорами я сейчас копаюсь, но в книгах вычитал, что это дурной тон... Буду признателен за идеи. P.S Поле ele здесь не зря. Я сочинил выборку по оному ele, в жизни их около 900. Реальное число строк сейчас около 2 000, скорость пополнения(редактирования) - 2-3 строки в день, в общем это - бесконечный медленно растущий справочник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 05:49 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
А в чем проблема поставить это на триггер. Ты и сам подал идею. Единственное но - должна быть точка выхода из триггера. Или условие, по которому он буде срабатывать, например при изменении только вышеназванных полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 06:09 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
>> Faza Сложности пока представляю приблизительно. В QA пока всё работает за исключением перехода через 2000 год - отрицат. datediff() получается, но на это есть BOL... Читаю вот. Меня интересовало, самый ли оптимальный вариант здесь работать с курсорами? Можно ли по-другому выкрутиться? Дело в том, что подобных задач у меня впереди много, и в курсоры там будет влетать не по три-пять строк, а по 2-3 сотни и не 2-3 раза в день, а непредсказуемо пока... Не "заткну" ли я тогда своими курсорами сервер? Хотелось бы сразу встать на самые оптимальные рельсы.. Спасибо за внимание к DOSовскому Foxисту. С уважением Андрей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 06:48 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
Насколько я понял вам нужно так ? http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=4225&Idle=365&Sort=0&Order=Descend&Page=8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 07:39 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
>>Glory Увы, увыжаемый Glory, если я правильно понял рекомендуемый Вами топик http://www.sql.ru/cgi-bin/UltraBoard/UltraBoard.pl?Action=ShowPost&Board=mssql&Post=4225&Idle=365&Sort=0&Order=Descend&Page=8, это не совсем то. 1. Ни одному из столбцов таблицы я не могу поставить pk. Not NULL может быть только kamp, но он уникален только в пределах ele, которых у меня 824 если быть точным. 2. Фокус с двойным равенством интересен (постараюсь запомнить), но результат д.б. прописан в srok_mi вычислением не суммы(разности) по самому вычисляемому столбцу, а вполне конкретной разности м. двумя соседними столбцами лишь логически расположенных рядом двух строк. Пока мне кажется, что в рекомендуемом Вами топике прав qu-qu, говоря "грузите промежуточные данные во временную таблицу, указав ORDER BY по дате и все просуммируется правильно". По сути это курсор и есть, от которых я хотел избавиться... Или я не понял чего-то? 3. Уже не к T-SQL. А как Вы так быстро находите нужные топики? Просто на память, или есть какой-то механизм? А то я часто мучаюсь "где-то видел (У вас же на SQL.RU)", а найти не могу. Спасибо за участие. С уважением Климов А. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 09:57 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, нужно рассчитать разницу между включениями/выключениями чего-то ? Единственно, что меня смущает так это нахождение "вполне конкретной разности м. двумя соседними столбцами лишь логически расположенных рядом двух строк". Это как - логически ? Если это просто kamp на 1 меньше чем у текущей записи, то так \ncreate table #t (kamp int, d_otkl datetime, d_podkl datetime, srok_mi int, ele int) insert #t values(1, NULL, '19840203 15:03', NULL, 1) insert #t values(2, '19880502 03:00', '19880517 06:32', 1234567, 1) insert #t values(3, '19890903 07:59', '19890918 23:00', 7654321, 1) insert #t values(4, '19930412 15:26', '19930426 08:56', 9876543, 1) insert #t values(5, '20020421 22:12', NULL, 1234567, 1) select *, cast(a.d_otkl as real) - (select cast(b.d_podkl as real) from #t b where b.kamp = (a.kamp-1)) from #t a drop table #t Ну а насчет быстрого поиска, так я уже давно "собираю" интересные топики в My Favorites ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 10:35 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
Как вариант, можно использовать не простые триггеры, а Instead-триггеры. Они гарантированно не приводят к рекурсии (а ведь для других таблиц рекурсивные триггеры вполне могут поднадобиться, что требует в простых триггерах дополнительных средств защиты от нежелательной рекурсии). Glory высветил весьма забавный нюанс. Если взглянуть на задачу "так сказать, вообще", то в одной команде Update может присутствовать модификация одновременно нескольких полей одновременно нескольких соседних записей. Не то, чтобы это какая-то серьезная проблема, даже совсем не проблема. Просто нужно сразу продумать такой вариант развития событий и однозначно определиться, во всех ли случаях корректно работает алгоритм. В частности, ведь это может привести и к модификации поля kamp... И даже к появлению нескольких записей с одним номером и с "дырками" в нумерации (если не предусмотрены соответсвующие констрейнты). Возможен случай, когда какой-нибудь мерзопакостный вредитель сельского хозяйства возьмет, да удалит запись из середины этой красивой логической последовательности. Что тогда должно произойти? Вобщем-то, вопросы скорее риторические. Я понимаю, что приложение, юзающее эту таблицу, скорее всего, подобных действий никогда не произведет. Но иногда подумать о нестандартных ситуациях заранее бывает полезно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 16:05 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
>>Glory Прошу простить мне, человеку, привыкшему к физической нумерации записей (строк), мой пассаж "лишь логически расположенных рядом двух строк". Конечно нужные мне строки раскиданы по таблице хаотично, но достаточно спокойно собираются хоть куда и хоть зачем. Да, Вы совершенно правы, что нужна разность между датами отключений и подключений электролизёров с соседними kamp, просто я хотел в перспективе отказаться от этого столбца (тут у меня ещё нет определённого решения). >>Garya "в одной команде Update может присутствовать модификация одновременно нескольких полей одновременно нескольких соседних записей"?!?! Опс-с-с-с воскликнул "прямоходящий". Это ещё как??? Если я ешё не слишком надоел, ткните носом где почитать, либо пример, а? Поле kamp долно быть уникально в пределах ele и д.б. NOT NULL, посему на предложение Glory можно вполне опираться. Удалить строку из середины этой стройной последовательности может не какая-нибудь злонамереннная саранча, а вполе благообразная божья коровка - это реальность, данная нам свыше. В таком случае немедленно должна перенумероваться kamp и пересчитаться srok_mi (это одна из задач мной сочиняемого триггера). Должен сказать: "Один ... неграмотный человек... способен задать столько вопросов, что сотня мудрецов останутся в тупике", а посему спасибо за участие и науку. Пошёл препарировать как Базаров лягушку select от Glory, потом думать над констрайнтами для достоверности данных. Update нескольких полей в нескольких записях??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2002, 03:12 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
Удалить строку из середины этой стройной последовательности может не какая-нибудь злонамереннная саранча, а вполе благообразная божья коровка - это реальность, данная нам свыше. В таком случае немедленно должна перенумероваться kamp и пересчитаться srok_mi При возникновении "дырок" в нумерации достаточно слегка изменить запрос и не будет нужды изменять поле kamp. Главное, чтобы сохранялась последовательность значений в kamp \ncreate table #t (kamp int, d_otkl datetime, d_podkl datetime, srok_mi int, ele int) insert #t values(1, NULL, '19840203 15:03', NULL, 1) insert #t values(2, '19880502 03:00', '19880517 06:32', 1234567, 1) --insert #t values(3, '19890903 07:59', '19890918 23:00', 7654321, 1) insert #t values(4, '19930412 15:26', '19930426 08:56', 9876543, 1) insert #t values(5, '20020421 22:12', NULL, 1234567, 1) select *, cast(a.d_otkl as real) - (select top 1 cast(b.d_podkl as real) from #t b where b.kamp <= a.kamp order by b.kamp ) from #t a drop table #t ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2002, 10:15 |
|
||
|
Нужен триггер для вычислений между строками
|
|||
|---|---|---|---|
|
#18+
Наконец меня допустили опять до SQL. Спасибо Glory за науку по Select & cast, НО!: 1. А что возвращает cast? Методом проб и ошибок выяснил, что разницу в датах м. заданной и началом 20 века. В BOL написано, результат будет округлён до минуты. Проверяю: select datediff(mi,'19000101','20020506') as datedifff, cast('20020506' as float) as castt, datediff(mi,'19000101','20020506')/cast('20020506' as real) as mnogitel Получаю: datedifff castt mnogitel ----------- ----------------------------------------------------- ------------------------ 53827200 20020506.0 2.6886034 ??????? 2. Посоветуйте прямоходящему рассылки, книги (бумажные, электронные) для начинающего с нуля. Мне надо ПОДРОБНЕЙШЕЕ описание языка TSql, советы по отладке (кроме QA) хранимых процедур и триггеров. Для начала, чтоб развивалась фантазия. P.S. Боюсь завалить этот форум детскими вопросами Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2002, 06:38 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32029612&tid=1822833]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 333ms |

| 0 / 0 |
