Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать группировку по сортировке? / 19 сообщений из 19, страница 1 из 1
25.04.2020, 19:36
    #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
25.04.2020, 20:12
    #39951455
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
какая версия сервера?

как вариант
пронумеруйте ваши блоки статуса с помощью RANK (с сортировкой) и выбирайте max-min из получившегося набора
...
Рейтинг: 0 / 0
25.04.2020, 20:14
    #39951456
Nika gnome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
2017 Developer
кстати, мысль. Точно. Сейчас попробую
...
Рейтинг: 0 / 0
25.04.2020, 20:33
    #39951461
Nika gnome
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
хотя стоп... не складывается что-то.
Одинаковый ранк присваивается первому и третьему блоку.
...
Рейтинг: 0 / 0
25.04.2020, 20:36
    #39951465
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
RANK тут не поможет. Сначала получите точки смены - сравниваете Cтатус и его LAG() при сортировке по дате, если равен - 0, иначе 1. И затем по этому полю берёте кумулятивно SUM() - на выходе номер группы.
...
Рейтинг: 0 / 0
25.04.2020, 20:43
    #39951471
iap
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
25.04.2020, 23:38
    #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
26.04.2020, 01:02
    #39951538
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
Nika gnome
Отсортировано по дате, но столбец a2 заполнен так будто отсортировано по категории
Да, всё правильно, так и должно работать, нумерация row_number никакого отношения к расположению строк в итоговом результате не имеет.

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

Т.е. фактически одна и та же программа на моих данных для категории "А" продолжает нумерацию (шестёрка подчёркнута), а для простого примера от пользователя iap нумерация начинается с начала.
Как так выходит?
...
Рейтинг: 0 / 0
26.04.2020, 01:22
    #39951548
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
Nika gnome, UNICODE ("Статус")
...
Рейтинг: 0 / 0
26.04.2020, 01:24
    #39951549
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
Nika gnome
Если вернуться к примеру, который мне посоветовали.
Вы бы текст выложили, что за любовь к скриншотам? Я же не буду переписывать с экрана.
...
Рейтинг: 0 / 0
26.04.2020, 01:32
    #39951553
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
Nika gnome
Тогда вообще не понятно.
Если вернуться к примеру, который мне посоветовали.
Он работает против логики.
Никакого "против логики".
У вас 2 разные группы, первая А, а вторая A
Вы же знаете, что в вашем скрипте из первого поста одна А русская, а другая английская, да?
...
Рейтинг: 0 / 0
26.04.2020, 01:38
    #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
26.04.2020, 01:40
    #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
26.04.2020, 01:41
    #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
26.04.2020, 08:36
    #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
26.04.2020, 09:28
    #39951576
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать группировку по сортировке?
nullin
Возьмём код iap , данные для которого предоставил Nika gnome
[SRC sql][/SRC]
Ага, я просто сначала ответил на пост ТС, а потом уже прочитал ваш.
С UNICODE тоже можно заметить. Но я смотрю в редакторе, он у меня коды символов показывает. А подозрение возникло сразу же, после результата row_number, показанного ТС
Nika gnome
таки как решить-то эту задачу?))
Вам Akina сразу ответил.
Для таких задач используют LED-LAG, ну, или можно ссылаться на предыдущую через номер row_count
Что бы здесь было легче помочь, начните с корректного примера (то есть без русских и английских А) :-)
...
Рейтинг: 0 / 0
26.04.2020, 09:47
    #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
01.05.2020, 23:30
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как сделать группировку по сортировке? / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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