Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги, окажите, пожалуйста, содействие. Суть в том, что есть табличка в которой id и 3 даты. Надо схлопнуть таким образом, чтобы если дата 3 пустая, то берем дату 3 из следующей строки и т.д. последняя строка должна содержать дату 2 в качестве закрывающей. С помощью аналитических функций не удалось добиться результата, решил попробовать с помощью курсора. Но ранее не пользовался и как-то не так работает. Подскажите, возможно ли обойтись без курсора, также необходимо учитывать, что записей в таблице много в рамках каждого ID, как это возможно учесть? т.е. по приведенному ниже примеру должны получится следующие строки: 1 2013-02-22 00:00:00.000 2013-03-01 00:00:00.0001 2013-03-22 00:00:00.000 2013-04-30 00:00:00.0001 2013-06-22 00:00:00.000 2013-07-12 00:00:00.0001 2013-07-22 00:00:00.000 2013-08-14 00:00:00.0001 2013-09-22 00:00:00.000 2013-10-28 00:00:00.0001 2013-12-22 00:00:00.000 2014-02-13 00:00:00.000 и т.д. ........ И послед строка: 1 2015-03-22 00:00:00.000 2015-08-21 00:00:00.000 Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:05 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
BSCHECK, то есть, другими словами - вам нужна "протяжка" последнего непустого значения на последующие строки? для этого идеально подошел бы last_value() over( order by ... ignore nulls), но в MS его пока нет. Но его можно заменить аналитическим MAX-ом с небольшим допилом напильником... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:20 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
Щукина АннаBSCHECK, то есть, другими словами - вам нужна "протяжка" последнего непустого значения на последующие строки? для этого идеально подошел бы last_value() over( order by ... ignore nulls), но в MS его пока нет. Но его можно заменить аналитическим MAX-ом с небольшим допилом напильником... но есть first_value ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:22 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
TaPaK, сказал - "а", говори - "б"(с) показывайте, как вы его тут будете применять без ignore nulls. но даже если и примените... дальнейшая логика не совсем понятна. что будет считаться непрерывной группой строк, в конце которой должно быть "последняя строка должна содержать дату 2 в качестве закрывающей"(с) но это не к вам вопрос, а ТС... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:29 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
Анна, Тарак, так как порекомендуете? Или поможете допилить курсор? MS SQL 2016 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:34 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
Щукина АннаBSCHECK, то есть, другими словами - вам нужна "протяжка" последнего непустого значения на последующие строки? для этого идеально подошел бы last_value() over( order by ... ignore nulls), но в MS его пока нет. Но его можно заменить аналитическим MAX-ом с небольшим допилом напильником... Все -таки назвал бы скорее схлопыванием строк, видно по примеру, что 2 строка схлопывается с 3 и из 2 строки берется df, а из 3 - fd ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:38 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
BSCHECK, но при этом почему-то совсем исчезают даты dt из 3 и 5 строк (дальше не смотрел) критерий не точный совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:47 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
ShIgorBSCHECK, но при этом почему-то совсем исчезают даты dt из 3 и 5 строк (дальше не смотрел) критерий не точный совсем. Не знаю как еще точнее описать. Фактически dt нужна только для последней строки. Берем строку, если fd заполнена записываем id, df, fd, если - нет переходим к следующей строке , если опять не заполнена , то опять к следующей. когда встречаем заполненную, то записываем id, df - из первой строки и fd из той где заполнена. Ну к примеру по этим 7 строкам: select 1 as id, '2013-02-22 00:00:00.000' as df, '2013-03-21 00:00:00.000' as dt, '2013-03-01 00:00:00.000' as fd union select 1 as id, '2013-03-22 00:00:00.000' as df, '2013-04-21 00:00:00.000' as dt, 'NULL' as fd union all select 1 as id, '2013-04-22 00:00:00.000' as df, '2013-05-21 00:00:00.000' as dt, '2013-04-30 00:00:00.000' as fd union all select 1 as id, '2013-06-22 00:00:00.000' as df, '2013-07-21 00:00:00.000' as dt, '2013-07-12 00:00:00.000' as fd union all select 1 as id, '2013-07-22 00:00:00.000' as df, '2013-08-21 00:00:00.000' as dt, '2013-08-14 00:00:00.000' as fd union all select 1 as id, '2013-09-22 00:00:00.000' as df, '2013-10-21 00:00:00.000' as dt, 'NULL' as fd union all select 1 as id, '2013-10-22 00:00:00.000' as df, '2013-11-21 00:00:00.000' as dt, '2013-10-28 00:00:00.000' as fd Должны получиться след. 5 записей: 1 2013-02-22 00:00:00.000 2013-03-01 00:00:00.000 1 2013-03-22 00:00:00.000 2013-04-30 00:00:00.000 1 2013-06-22 00:00:00.000 2013-07-12 00:00:00.000 1 2013-07-22 00:00:00.000 2013-08-14 00:00:00.000 1 2013-09-22 00:00:00.000 2013-10-28 00:00:00.000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 10:56 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
BSCHECKберем дату 3 из следующей строки и т.дЧем определяется "следующая строка"? Все id равны почему-то 1... P.S. Забудьте на время слово "курсор". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 11:10 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
iapBSCHECKберем дату 3 из следующей строки и т.дЧем определяется "следующая строка"? Все id равны почему-то 1... P.S. Забудьте на время слово "курсор". Следующая строка определяется df. c сортировкой по возрастанию. Для примера привел id =1, т.к. рассматриваем строки и даты в рамках id. Естественно, таких id в таблице много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 11:15 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 11:49 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
invm Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Спасибо, INVM! Да вы прямо маг и чародей! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 11:58 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
Спортивный интерес - так работает (не до конца понимаю условие)? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 15:14 |
|
||
|
Курсоры циклы консультация
|
|||
|---|---|---|---|
|
#18+
LameUserСпортивный интерес - так работает (не до конца понимаю условие)? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Да, так тоже работает. Еще 1 маг )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2018, 15:56 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39686773&tid=1689282]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 345ms |

| 0 / 0 |
