Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
дано, есть набор записей такого типа (неважные поля выпущены) reg nd np kp stp 6 129241 2010-01-01 2010-06-10 1-1 6 129241 2010-06-11 2010-06-30 1-1 6 129241 2010-07-01 2010-12-31 1-1 6 129241 2005-06-11 2005-06-30 1-1 6 129241 2005-07-01 2005-12-31 1-1 получено группировкой select distinct a.* from los3 a inner join los3 b on (a.reg,a.nd)=(b.reg,b.nd) and a.stp=b.stp where a.reg=6 and a.nd='129241' and (days(a.np)-days(b.kp)=1 or days(b.np)-days(a.kp)=1) order by a.stp,a.np т.е. я искал записи в делах, где начало одного периода наступает на следующий день после предыдущего и тип (stp) периода совпадает. Таких дел очень много. Хотел проставить ключ (чтоб использовать для последующего объединения) для таких записей, содержащий номер участка, дела, тип, минимальную и максимальную даты из набора дат для ключа. Проблема обнаружилась в том, что (как видно), может быть, что таких наборов для сливания в деле может быть больше одного. Не могу додумать, можно ли как-то разделить эти наборы, чтобы каждому присвоить свой ключ. Чувствую, что средствами просто запросов SQL нереально, значит, нужна хранимая процедура, но опыта в них почти ноль. Кто что подскажет? Массив записей для обработки - порядка 4,5 млн. штук. p.s. дело срочное, в 24-25-го уже нужна реализация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2012, 13:25 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
db2 v.9.7 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2012, 13:54 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars, Как-то так... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2012, 10:53 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein , благодарю за ответ, к сожалению, я только смутно понял идею, но реализовать в приложении к моей ситуации не хватает знаний. Понял, что можно добавочно к моей базовой идее съюзать rownumber. Процедуры умею пока писать только на уровне набора простых селектов/стандарных команд аля запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2012, 14:33 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibarsк сожалению, я только смутно понял идею, но реализовать в приложении к моей ситуации не хватает знаний. Понял, что можно добавочно к моей базовой идее съюзать rownumber. Процедуры умею пока писать только на уровне набора простых селектов/стандарных команд аля запросrownumber здесь просто для нумерации укрупнённых диапазонов дел. Это для "разделить эти наборы, чтобы каждому присвоить свой ключ". Т.е. когда диапазоны слиты, им присваивается "ключ". Основная идея здесь - как можно использовать Recursive Common Table Expression в DB2 для объединения в один нескольких непосредственно следующих друг за другом диапазонов дат по одной сущности (делу). Представьте, что вы сделали из этого запроса insert select. Код: plaintext 1. 2. 3. Результ этого запроса вообще вам поможет, или я неправильно понял, что вам надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2012, 16:25 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark, ещё раз благодарю за помощь. К сожалению временно поезд уже ушел, в срочном порядке делаю как получилось (знаю, что часть записей будет неправильно), но срок горит. Начиная с мая, к теме вернусь и буду не спеша разрабатывать и вкапываться для переделки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2012, 16:56 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark, опять обращаюсь за помощью по той же теме (пришло время сделать как надо). Попробовал понять логику вашего примера и переписать под известные и понятные мне конструкции (попутно изменилась немного таблица с данными, откуда надо выбрать искомое, вместо пары ключевых полей теперь одно). итак, есть таблица, где у одного дела строки с такими временными отрезками 1988-10-03 1997-05-31 1997-07-01 1998-02-08 1998-02-17 1998-06-03 1998-06-04 1998-10-01 1998-10-07 1999-04-27 1999-04-28 2003-08-31 2003-09-01 2003-09-21 2003-09-22 2003-12-31 2004-01-01 2004-02-01 2004-02-02 2010-11-19 2010-11-20 2011-03-31 видно, что должно получиться два отрезка с 1998-02-17 по 1998-10-01 и с 1998-10-07 по 2011-03-31. используя ваш пример, написал следующее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Получилось не то, что ожидал. Где моя ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2012, 15:58 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars... Получилось не то, что ожидал. Где моя ошибка? Вы сделали совсем не то, что я написал. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2012, 16:59 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars, Просьба. Когда получится, посмотрите, pls, разницу планов с вот таким вариантом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. или в новых терминах: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Очень интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2012, 17:55 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars... d1d21988-10-031997-05-311997-07-011998-02-081998-02-171998-06-031998-06-041998-10-011998-10-071999-04-271999-04-282003-08-312003-09-012003-09-212003-09-222003-12-312004-01-012004-02-012004-02-022010-11-192010-11-202011-03-31... видно, что должно получиться два отрезка с 1998-02-17 по 1998-10-01 и с 1998-10-07 по 2011-03-31. По исходным данным видно как раз несколько иное. Лично я там вижу четыре диапазона: d1d21988-10-031997-05-311997-07-011998-02-081998-02-171998-10-011998-10-072011-03-31 Или я как-то не так понял принцип объединения малых интервалов в более крупный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 05:29 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
А вообще, запрос мог бы иметь примерно такой вид: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 05:44 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark, Добрый Э - Эх, CawaSPb, благодарю за ответы. все получилось, можно использовать на реальных данных. Постараюсь допонять до конца. Добрый Э - Эх. Вообще-то да, верно всё понято, просто я не конца объяснил. В конечном итоге получаются эти 4 интервала, просто для меня главной сложностью было выделить и объединить то, что подлежит этой операции. Отдельные записи, которые слитию не подлежат, можно добавиться уже потом. Хотя, как теперь вижу, можно делать всё разом. CawaSPb, план запроса у меня CC вообще не показывает. Возможно, не хватает прав (я не админ базы), а может, что-то ещё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 11:32 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars, А что именно говорит? Вероятно просто explain таблицы для текущей схемы отсутствуют (explain ищет таблицы для промежуточного сохранения информации в текущей схеме). Можно их с помощью SYSINSTALLOBJECTS procedure сделать: Код: sql 1. (попросить сделать кого-либо с достаточными правами). Можно сделать самому с помощью sqllib/misc/explain.dll. По первому варианту можно сделать одну общую копию explain таблиц и пробросить к ним alias'ы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2012, 13:46 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
CawaSPb, в sqllib/misc/ у меня нет explain.dll, там всего лишь одна (другая) длл-ка. дали мне временно админа, попробовал выполнить указанную процедуру вот так call SYSPROC.SYSINSTALLOBJECTS('EXPLAIN', 'C', 'systoolsspace', 'ka11'); пространства разные пробовал (все 5, что вижу в списке table spaces), на все дает ошибку ... is an undefined name. SQLSTATE=42704. То же самое происходило и при попытках выполнения под моим пользователем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 10:05 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
таблиц explain-, да в нужной схеме нет. план запроса ничего не говорит, просто серое окошко без текста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 11:12 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars, explain.d d l, конечно. Попробовать call SYSPROC.SYSINSTALLOBJECTS('EXPLAIN', 'C', cast(null as VARCHAR(128)), 'ka11'); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 12:56 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
попробовал. выдало: Return Status = 0 вставил предложенный запрос по датам, он выполнился, показал выборку, план по-прежнему пуст ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 13:13 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars, А вот так: Код: plaintext Предварительно запихнув запрос в query.sql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 13:46 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
записал запрос в c:\query.sql в обычной ком.строке набил: db2expln -database actuar -user up000117 [тут пароль] -output c:\plan.txt -stmtfile c:\query.sql -terminator ";" -graph -opids выдал это: Error during explain call. Message Text = SQL0444N Routine "explain" (specific name "SQL121121142052360") is implemented with code in library or path "\db2exsrv", function "explain" which cannot be accessed. Reason code: "4". SQLSTATE=42724 и далее еще параметры всякие... пустой файл c:\plan.txt создался. -на всякий случай: у меня под одним юзером несколько схем, тут видно, что юзер не= ka11. ту же ошибку пишет для админа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 14:41 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark Добрый Э - Эх опять прошу помощи по этой же теме. В той же таблице в каждой записи есть ещё и поля с суммами дней (посчитанные разными способами). Есть ли способ включить в уже предложенные запросы объединения строк по датам и объединение по суммам (например, поля s1, s2) или такого способа нет, и мне придётся уже потом искать способ вставки в поля новой таблицы сгруппированных сумм? Самостоятельно пока не получилось - по версии Марка не разрешает группировать одновременно и для дат, и для сумм. По версии Э - Эх суммирует, но обнаружилась проблема группировки в сложных случаях набора дат, например: reg nd np kp st ns sev 6 129241 1990-02-12 1991-10-14 1-2 0 1 6 129241 1991-10-15 1995-09-30 1-3 0 1 6 129241 1995-11-04 2001-12-31 1-2 0 1 6 129241 2002-01-01 2009-12-31 1-2 0 1 Тут период '1-2' неверно объединяется, как если бы внутри не было периода '1-3' мой вариант: select reg,nd,st,ns,sev,min(np) as x_d1, max(kp) as x_d2,sum(s1d),sum(s2d),sum(s3d) from (select reg,nd,st,ns,sev,np, kp, s1d,s2d,s3d,sum(sog) over(order by reg,nd,st,ns,sev,np) as grp_id from (select reg,nd,st,ns,sev,np, kp,s1d,s2d,s3d, case when np<=max(kp+1 day) over(order by reg,nd,st,ns,sev,np rows between unbounded preceding and 1 preceding) then 0 else 1 end as sog from loz11 where reg=6 and nd='129241') ) group by reg,nd,st,ns,sev,grp_id order by 1,x_d1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 10:57 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars Код: plaintext 1. 2. 3. 4. 5. Т.е. это (reg, nd, st) или (reg, nd, st, ns, sev)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 13:56 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, да, все эти поля - ключи для группировки: reg,nd,st,ns,sev ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 14:01 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
skibars, Если я правльно понял задачу - просуммировать о полю внутри группы, то как-то так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 14:30 |
|
||
|
как "слить"-объединить стоящие рядом по дате записи
|
|||
|---|---|---|---|
|
#18+
Mark ваш пример работает. попробовал переписать под свой запрос (учитывая фактические поля в таблице) так create view loz_v (key, reg,nd, d1, d2, stkt,nspis2,sever,s1d) as with a (lvl, reg,nd, nper,kper, stkt,nspis2,sever,s1d) as (select 1, reg,nd, stkt,nspis2,sever, nper,kper,s1d from loz11 t1 where reg=6 and nd='129241' and not exists (select 1 from loz11 t2 where (t2.reg,t2.nd,t2.stkt,t2.nspis2,t2.sever)=(t1.reg,t1.nd,t1.stkt,t1.nspis2,t1.sever) and t2.kper=t1.nper-1 day) union all select a.lvl+1, a.reg,a.nd, a.stkt,a.nspis2,a.sever, a.nper,t.kper,a.s1d+t.s1d from a, loz11 t where (t.reg,t.nd,t.stkt,t.nspis2,t.sever)=(a.reg,a.nd,a.stkt,a.nspis2,a.sever) and t.nper=a.kper + 1 day) select a.* from a join (select max(lvl) lvl, reg,nd, stkt,nspis2,sever, nper from a group by reg,nd, stkt,nspis2,sever, nper) g on g.lvl=a.lvl and (g.reg,g.nd,g.stkt,g.nspis2,g.sever,g.nper)=(a.reg,a.nd,a.stkt,a.nspis2,a.sever,a.nper) при попытке выполнения (без создания вью) ругается Error: SQL0401N The data types of the operands for the operation "=" are not compatible Перепроверил все =, так и не понял, где несовместимые типы. И ещё: раньше в конце была конструкция с select rownumber() over(order by... теперь без неё даты не упорядочиваются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2013, 16:32 |
|
||
|
|

start [/forum/moderation_log.php?user_name=4mo]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
13ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 962ms |
| total: | 1186ms |

| 0 / 0 |
