powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать группировку по сортировке?
19 сообщений из 19, страница 1 из 1
Как сделать группировку по сортировке?
    #39951437
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дата Статус1 А4 А5 А9 А14 B15 B16 B18 B20 A21 A24 A25 C
Вообще, хочу получить результирующую таблицу:
ДатаОт ДатаПо Статус113 А14 19 B20 24 A25 25 C
Думаю как-то сделать группировку типа
Код: sql
1.
2.
3.
Select min(Дата), max(Дата), Статус
From T
Group By Статус


Но не могу понять, как надо написать код, чтобы вышло то, что хочется.

P.s. пример упрощён. Вместо "статус" у меня на самом деле десяток полей. Просто чтобы обозначить, что в одном из множества полей что-то поменялось.
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951455
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая версия сервера?

как вариант
пронумеруйте ваши блоки статуса с помощью RANK (с сортировкой) и выбирайте max-min из получившегося набора
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951456
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2017 Developer
кстати, мысль. Точно. Сейчас попробую
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951461
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя стоп... не складывается что-то.
Одинаковый ранк присваивается первому и третьему блоку.
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951465
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RANK тут не поможет. Сначала получите точки смены - сравниваете Cтатус и его LAG() при сортировке по дате, если равен - 0, иначе 1. И затем по этому полю берёте кумулятивно SUM() - на выходе номер группы.
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951471
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH D AS(SELECT * FROM(VALUES
 (1, 'А')
,(4, 'А')
,(5, 'А')
,(9, 'А')
,(14, 'B')
,(15, 'B')
,(16, 'B')
,(18, 'B')
,(20, 'A')
,(21, 'A')
,(24, 'A')
,(25, 'C')
)T(ID,V)
)
,T AS(SELECT N=ROW_NUMBER()OVER(ORDER BY ID)-ROW_NUMBER()OVER(PARTITION BY V ORDER BY ID),* FROM D)
SELECT B=MIN(ID),E=ISNULL(LEAD(MIN(ID))OVER(ORDER BY N)-1,MAX(ID)),V
FROM T
GROUP BY N,V
ORDER BY B;
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951527
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выглядит логично и пример 100% рабочий.
Но как только начинаю применять его в жизни, выходит какая-то дичь
результат становится непредсказуемым.
Отличается только наличием where либо во внешнем запросе
Код: sql
1.
2.
3.
4.
5.
6.
7.
....
T AS(SELECT N=ROW_NUMBER()OVER(ORDER BY ID)-ROW_NUMBER()OVER(PARTITION BY V ORDER BY ID),* FROM D)
SELECT B=MIN(ID),E=ISNULL(LEAD(MIN(ID))OVER(ORDER BY N)-1,MAX(ID)),V
FROM T
WHERE ...
GROUP BY N,V
ORDER BY B;


Либо во внутреннем.
Ниже на скриншоте рассмотрен мой вариант. Как так выходит, что в row_number игнорируется инструкция order by date?

Отсортировано по дате, но столбец a2 заполнен так будто отсортировано по категории
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951538
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnome
Отсортировано по дате, но столбец a2 заполнен так будто отсортировано по категории
Да, всё правильно, так и должно работать, нумерация row_number никакого отношения к расположению строк в итоговом результате не имеет.

Т.е. внутри каждой группы, которые различаются по критериям в partition by, записи нумеруются, от 1 и далее, по порядку, который установлен в соответствии с order by
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951544
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда вообще не понятно.
Если вернуться к примеру, который мне посоветовали.
Он работает против логики.

Т.е. фактически одна и та же программа на моих данных для категории "А" продолжает нумерацию (шестёрка подчёркнута), а для простого примера от пользователя iap нумерация начинается с начала.
Как так выходит?
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951548
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nika gnome, UNICODE ("Статус")
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951549
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnome
Если вернуться к примеру, который мне посоветовали.
Вы бы текст выложили, что за любовь к скриншотам? Я же не буду переписывать с экрана.
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951553
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nika gnome
Тогда вообще не понятно.
Если вернуться к примеру, который мне посоветовали.
Он работает против логики.
Никакого "против логики".
У вас 2 разные группы, первая А, а вторая A
Вы же знаете, что в вашем скрипте из первого поста одна А русская, а другая английская, да?
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951556
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, астрологи объявили неделю unicode троллинга.
Возьмём код iap , данные для которого предоставил Nika gnome
Код: sql
1.
2.
3.
4.
5.
6.
7.
WITH D AS(SELECT * FROM(VALUES
 (1, N'А')
,(20, N'A')
)T(ID,V))

select ID, V, unicode(V) U
from D


ID V U1 А 104020 A 65
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951557
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Nika gnome
Если вернуться к примеру, который мне посоветовали.
Вы бы текст выложили, что за любовь к скриншотам? Я же не буду переписывать с экрана.

да ведь текст-то выше.

Суть в том, что я подменил его заготовленную таблицу на свою - и получил другой результат.
Итак, код и результат

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
		a2=row_number() over (partition by 
								[Category]
							  order by [date])
      , [Category]
	  , UNICODE ([Category])
      , Date
	  from [factOrders] o
	  where ExpPrjKey =719
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951558
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin
alexeyvg, астрологи объявили неделю unicode троллинга.
Возьмём код iap , данные для которого предоставил Nika gnome
Код: sql
1.
2.
3.
4.
5.
6.
7.
WITH D AS(SELECT * FROM(VALUES
 (1, N'А')
,(20, N'A')
)T(ID,V))

select ID, V, unicode(V) U
from D



ID V U1 А 104020 A 65

ссццукка))))

таки как решить-то эту задачу?))
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951572
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот вам по шагам алгоритм

Код: 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.
WITH D AS(SELECT * FROM(VALUES
 (1, 'A')
,(4, 'A')
,(5, 'A')
,(9, 'A')
,(14, 'B')
,(15, 'B')
,(16, 'B')
,(18, 'B')
,(20, 'A')
,(21, 'A')
,(24, 'A')
,(25, 'C')
)T(ID,V)
),

E as (
select *, 
case when LAG(V) OVER(ORDER BY ID) <> V then 1  else 0 end as chk
 from D
),

F as (

select * ,
sum(chk) OVER(ORDER BY ID ASC) as group_id
from E

)

select  min(ID), max(ID), V
from F
GROUP BY group_id, V



позапускайте каждый сте, посмотрите где вас не устраивают результаты
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951576
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin
Возьмём код iap , данные для которого предоставил Nika gnome
[SRC sql][/SRC]
Ага, я просто сначала ответил на пост ТС, а потом уже прочитал ваш.
С UNICODE тоже можно заметить. Но я смотрю в редакторе, он у меня коды символов показывает. А подозрение возникло сразу же, после результата row_number, показанного ТС
Nika gnome
таки как решить-то эту задачу?))
Вам Akina сразу ответил.
Для таких задач используют LED-LAG, ну, или можно ссылаться на предыдущую через номер row_count
Что бы здесь было легче помочь, начните с корректного примера (то есть без русских и английских А) :-)
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39951582
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nika gnome, вот, налабал на коленке:
Код: 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.
E as (
select *, 
lag(v) over(order by id) as lag_v
from D
),

F as (
select *,
sum(case when lag_v != v then 1 else 0 end) OVER(ORDER BY ID) as g_id
from E
),

G as (
select *, 
lead(case when lag_v != v then id end, 1, id) over(order by g_id) - 1 as n_id
from F
),

H as (
select g_id, v, min(id) as s, max(id) as e, max(n_id) as x
from G
group by g_id, v
)

select g_id, v, s, case when x <= e then e else x end as e
from H
order by g_id
...
Рейтинг: 0 / 0
Как сделать группировку по сортировке?
    #39953643
Фотография Nika gnome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nullin
Nika gnome, вот, налабал на коленке:
Код: 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.
E as (
select *, 
lag(v) over(order by id) as lag_v
from D
),

F as (
select *,
sum(case when lag_v != v then 1 else 0 end) OVER(ORDER BY ID) as g_id
from E
),

G as (
select *, 
lead(case when lag_v != v then id end, 1, id) over(order by g_id) - 1 as n_id
from F
),

H as (
select g_id, v, min(id) as s, max(id) as e, max(n_id) as x
from G
group by g_id, v
)

select g_id, v, s, case when x <= e then e else x end as e
from H
order by g_id


Какое же гениальное решение! Теперь не знаю, как без него жить.
У меня есть несколько других сложных запросов, типа "как заполнить пустые значения последним не пустым" - поиск в и-нете показал, что на stackoverlow такой запрос порекомендовали выполнять рекурсивным запросом. Но вот это решение настолько простое и быстро работающее, что не идёт ни в какое сравнение с тем рекурсивным, громоздким.
Прям круто!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать группировку по сортировке?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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