powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разбить на группы
23 сообщений из 23, страница 1 из 1
Помогите разбить на группы
    #39819133
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Пусть есть таблица
Код: sql
1.
2.
3.
4.
declare @temp table(code int, ord int)
insert @temp(code,ord) values(1,1),(2,2),(3,3),(4,4),(2,5),(2,6)

select * from @temp

, где code - идентификатор элемента(fk), code - поле, которое задает сортировку.

Идем в порядке по полю ord, и если текущее значение code отличается от предыдущего, то увеличиваем номер группы.
Т.е. на выходе должны получить:
Код: plaintext
1.
2.
3.
4.
5.
6.
code	ord    group
1	1  1
2	2  2
3	3  3
4	4  4
2	5  5
2	6  5

Есть элегантное решение?
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819150
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Есть элегантное решение?Есть. И не одно. Искать на данном форуме по ключевому слову start_of_group, например...
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819153
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

как вариант - поискать топики со словом " инвариант". Его не так прозрачно, как start_of_group, но можно и на вашу задачу натянуть...
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819156
BredSpit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>=2012 в лоб
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @temp table(code int, ord int)
insert @temp(code,ord) values(1,1),(2,2),(3,3),(4,4),(2,5),(2,6)

;with cte 
as
(
select code,
case when  code<>lag(code)  over (order by ord)  and lag(code)  over (order by ord) is NOT NULL then 1 else 0 end as SM,ord
from @temp
)
select code,ord,sum(SM) over (order by ord)+1 
 from cte
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819158
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BredSpit,

второй лаг - лишний. хватит и одного.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t (code, ord)as 
(select * from (values(1,1),(2,2),(3,3),(4,4),(2,5),(2,6))v(c,o)
)
--
select code, ord
     , sum(start_of_group) over(order by ord) as x_dense_rank
  from (
         select code, ord
              , case lag(code) over(order by ord) 
                  when code then 0 
                  else 1 
                end as start_of_group 
           from t
       ) v
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819166
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Элегантное решение - это не насиловть SQL, решая на нем совершенно нереляционные задачи, а делать такие вещи в клиентском приложении.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819168
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

разработчики так старались, засовывали в SQL оконные функции. Ицек БенГан написал толстую книгу по их использованию для написания эффективного SQL-кода. А вы так вот взяли и поставили на всем крест?
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819177
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаfkthat,

разработчики так старались, засовывали в SQL оконные функции. Ицек БенГан написал толстую книгу по их использованию для написания эффективного SQL-кода. А вы так вот взяли и поставили на всем крест?
Да зачем же крест ставить - прикольная штука. Особенно прикольно потом поддерживать такие запросы, где СTE, оконная ф-ия и вложенный подзапрос с еще одной оконной ф-ией. И это всего лишь в запросе, где даже десятка строк нет. А у нас тут есть, например, кое-какое легаси, где недавно нашли хранимку, в которой 2846 (две тысячи восемьсот сорок шесть - специально прописью повторил) строк
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819189
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Все получилось.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819193
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatА у нас тут есть, например, кое-какое легаси, где недавно нашли хранимку, в которой 2846 (две тысячи восемьсот сорок шесть - специально прописью повторил) строк Вот именно потому в вашем легаси и есть 2846 строк (две тысячи восемьсот сорок шесть - специально прописью повторил(с)), что не было простых и надежный вариантов в виде "СTE, оконной ф-ия и вложенного подзапроса с еще одной оконной ф-ией"(с)
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819194
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

перепишите хотелку автора без всего современного тюнинга. И получите очередное легаси, на сильно больше, чем 10 строк кода...
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819212
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаfkthat,

перепишите хотелку автора без всего современного тюнинга. И получите очередное легаси, на сильно больше, чем 10 строк кода...Зря стараетесь :)
Как показывает практика, подобные аргументы апологетами подхода "не насиловать SQL" не воспринимаются.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819220
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаfkthat,

перепишите хотелку автора без всего современного тюнинга. И получите очередное легаси, на сильно больше, чем 10 строк кода...

Я бы, скорее всего, это поле group просто тупо вставлял еще при добавлении записей в таблицу.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819234
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatнашли хранимку, в которой 2846 (две тысячи восемьсот сорок шесть - специально прописью повторил) строк


а чего она такая маленькая то?
небось не форматировали, да каждый запрос в одну строку писали.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819241
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЯ бы, скорее всего, это поле group просто тупо вставлял еще при добавлении записей в таблицу.путь истинного джедая - хранить вычисляемые значения и изменять их всякий раз при обновлении данных в таблице... Хорошо, если данные будут прирастать только в "конец" таблицы. А если - в середину?
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819287
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatЭлегантное решение - это не насиловть SQL, решая на нем совершенно нереляционные задачи, а делать такие вещи в клиентском приложении.


fkthat уверен, что сервер баз данных и приложение находятся в отношении 1:1.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819291
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЭлегантное решение - это не насиловть SQL, решая на нем совершенно нереляционные задачи, а делать такие вещи в клиентском приложении.

Надо же понимать - где насилие. а где нет. Пробрасывать на клиента пару миллионов строк, чтобы рассчитать группы - самое прямое насилие, которое только есть. Нельзя спешить с выводами, не понимая контекста и не убедившись в правильности суждений в каждом конкретном случае.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819294
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

Для тех, кто застрял в эпохе FoxPro и Дельфи, - под клиентским приложением подразумевается вовсе не обязательно окошко виндовс, в котором операционистка тетя Маша мышью тычет.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819296
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовПробрасывать на клиента пару миллионов строк, чтобы рассчитать группы - самое прямое насилие, которое только есть.

Пробросить только нужные. По-любому, если их пронумеровать в сиквеле, как ТС хочет, то два млн. строк так и останутся двумя млн. строк, т.ч. наружу все равно отправится только какая-то их часть.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819305
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatWlr-l,

Для тех, кто застрял в эпохе FoxPro и Дельфи, - под клиентским приложением подразумевается вовсе не обязательно окошко виндовс, в котором операционистка тетя Маша мышью тычет.

О, да! У вас крутое приложение с запросами по тысячи строк SQL, в которых вам не разобраться, лучше на С да с for на клиенте!
А мы, что? глушь, деревня! С приложениями, реализованными с помощью Delphi, C#, Excel со его VBA, только FoxPro уже осталась в воспоминаниях. Да еще и наша тетя Маша мышью тычет куда попало!
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819308
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatВладислав КолосовПробрасывать на клиента пару миллионов строк, чтобы рассчитать группы - самое прямое насилие, которое только есть.

Пробросить только нужные. По-любому, если их пронумеровать в сиквеле, как ТС хочет, то два млн. строк так и останутся двумя млн. строк, т.ч. наружу все равно отправится только какая-то их часть.

АГА, если пронумеровать, то получить группы уже не так сложно. Книгу, где это описывается вам уже порекомендовали!

Так два миллиона строк на клиента вывалили, а теперь еще и с номерами!

Кстати, сиквел - неудачный термин. Историю надо знать!
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819319
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wlr-l,

Тебе бы из книг я порекомендовал начать с букваря. Глядишь, научился бы сначала читать, что тебе другие пишут.
...
Рейтинг: 0 / 0
Помогите разбить на группы
    #39819326
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatПробросить только нужные. По-любому, если их пронумеровать в сиквеле, как ТС хочет, то два млн. строк так и останутся двумя млн. строк, т.ч. наружу все равно отправится только какая-то их часть.Вам бы матчасть по ранжирующим и оконным функциям подучить, а потом уже дискутировать.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разбить на группы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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