|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Доброго дня, помогите пожалуйста найти решение. Имеется таблица [Период], [Параметр], [Группа]. Группа возрастает с порядком месяца. Задача состоит в том, чтобы переназначить группы с учетом условия - "если параметр в текущем месяце меньше 3 то нужно ему присвоить группу предыдущего, и так 2 раза (т.е. возможно объединение до 3х месяцев), если параметр больше 3 - группа остается неизменной". Мне показалось, что я сделал это с помощью: [параметр] < 3 and (LAG([параметр]) OVER(ORDER BY [группа] DESC) < 3 И так два раза. Но как оказалось все сыпется если будет много подряд параметров < 3. Не вижу никакого способа это решить без процедуры, но дело в том, что эта таблица является select'ом и потом уходит в join к другой таблце, все это в длинном WITH. Отсюда вопрос - как передать select в процедуру и отдать обратно на join? Если можно хотя бы структуру кода. Или может быть есть какое то альтернативное решение? P.S. Таблица может быть очень большой. Период Параметр Группа Обновленная группа07.2021 1 1 108.2021 2 2 109.2021 3 3 310.2021 1 4 411.2021 1 5 412.2021 1 6 4 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 15:07 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, если нумерация групп идёт без пропусков и предыдущая - это группа с меньшим номером, то текущий номер - 1 и будет предыдущая группа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 15:18 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Владислав Колосов, Да, все так. Но задача состоит в том что группы нужно объединять. До порога в 3 строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 15:21 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14 "если параметр в текущем месяце меньше 3 то нужно ему присвоить группу предыдущего Период Параметр Группа Обновленная группа10.2021 1 4 4 а почему тогда 4, а не 3 стоит? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 15:49 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Oleg_SQL, В том то и проблема, что 2 следюющих месяца группируются к этогому, и и теперь их общая сумма будет равна 3. И все они будут иметь группу 4. Т.е. переназначение групп идет с конца. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 15:57 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Oleg_SQL, Т.е. задача не просто присвоить предыдущую группу если параметр меньше 3, а "сгруппировать" периоды чтобы сумма парметров была не меньше 3. Но не бесконечно это делать, а останавиваться, когда порог достигнут. В каком нибудь питоне это можно сделать с легкостью, но как в SQL это все запихнуть, я не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 16:00 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, непонятно из описания и картинка тоже не проясняет какие такие объединения. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 16:37 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Владислав Колосов, Ну вот же, 6я группа стала 4ой, 5я стала 4ой, 4я осталась 4ой. Столбец "Обновленная группа".. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 17:14 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, а почему это произошло? И как были преобразованы остальные номера? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 17:23 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Владислав Колосов, Задача и состоит в том чтобы выполнить эту процедуру. А произошло это потому что, в декабре параметр имеет значение 1, значит его нужно отнести в одну группу с ноябрем. в ноябре параметр тоже имеет значение 1, и в сумме с декабрем будет 2, значит оба месяца нужно отнести уже к группе Октября в октябре параметр имеет значение 1, в сумме с предыдущими будет >= 3. Значит группа сформирована: Декабрь, Ноябрь, Октябрь должны получить одну группу. Сентябрь уже имеет параметр равный 3 - остается без изменения. Август объединяется с Июлем, сумма будет 2. Был бы июнь - их нужно было бы объеденить с июнем. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 17:31 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, понятно, если долго не думать, то здесь проще всего применить итеративный подход, то есть организовав цикл по записям, например, курсором в обратном порядке относительно периодов. При этом надо запоминать номера ключей, которые будут обновлены найденным номером группы, затем таблицу ключей очищать и так пока не закончатся строки с курсоре. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2021, 18:04 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Владислав Колосов, Спасибо, скажите, а есть ли способ передать в процедуру результат Select и отдать из нее таблицу обратно? Без сохранния этого Select в отдельную таблицу ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 10:29 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, Для того, чтобы передать процедуре набор данных, можно использовать табличный тип или преобразовать данные в XML. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 10:34 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, Создаем тип. Он привязывается к базе данных. В другой базе придется пересоздавать. Код: sql 1. 2. 3. 4. 5. 6.
Создаем процедуру, где указываем, что входной параметр будет нашего типа Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Далее используем: Объявляем переменную нашего типа: Код: sql 1.
Наполняем данными: Код: sql 1. 2. 3. 4.
и сразу после наполнения, сразу вызываем процедуру Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2021, 21:36 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Двоичник, Спасибо большое, вроде начинает проясняться. Пара вопросов вопросов: вот когда я вызвал процедуру exec... - она мне вернет таблицу? Как ее сразу же отправить на Join к другой таблице? И когда вы наполняете данными переменную - могу я ее наполнять не конкретными значениями через union all, а в виде одного selecta из другогой таблицы? И похоже все таки это все предеться делать отдельно, в основное обобщенное табличное выражение exec, как я понимаю не запихнуть.. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2021, 13:03 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Mellok14, авторвызвал процедуру exec... - она мне вернет таблицу? Как ее сразу же отправить на Join к другой таблице? Используйте не процедуру, а табличную функцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2021, 13:48 |
|
Как передать в процедуру Select и также вернуть обратно табличную форму.
|
|||
---|---|---|---|
#18+
Владислав Колосов, Спасибо большое, почитал - то что нужно. А момент с созданием "Типа" и записей текущей таблицы в переменную остается? И эта переменная (таблица) отправляется в табличную функцию? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2021, 16:19 |
|
|
start [/forum/topic.php?fid=46&fpage=10&tid=1684142]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 159ms |
0 / 0 |