powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нумерация групп, разделенных строкой
14 сообщений из 14, страница 1 из 1
Нумерация групп, разделенных строкой
    #39926922
dimonovych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
есть выборка в виде

id1id2in_movetime_stime_end19152578016.01.2020 7:54:4016.01.2020 7:54:4019152578016.01.2020 7:54:4016.01.2020 7:55:1019152578016.01.2020 7:55:1016.01.2020 7:55:2019152578016.01.2020 7:55:2016.01.2020 7:55:5019152578116.01.2020 18:53:0016.01.2020 18:54:0019152578016.01.2020 18:54:0016.01.2020 19:00:3019152578016.01.2020 19:00:3016.01.2020 19:00:5019152578016.01.2020 19:00:5016.01.2020 19:01:1019152578016.01.2020 19:01:1016.01.2020 19:01:30

Нужно как то получить отдельные номера для красной и синей групп.
То есть что то типа
id1id2in_movetime_stime_endgroup19152578016.01.2020 7:54:4016.01.2020 7:54:40119152578016.01.2020 7:54:4016.01.2020 7:55:10119152578016.01.2020 7:55:1016.01.2020 7:55:20119152578016.01.2020 7:55:2016.01.2020 7:55:50119152578116.01.2020 18:53:0016.01.2020 18:54:00не важно19152578016.01.2020 18:54:0016.01.2020 19:00:30219152578016.01.2020 19:00:3016.01.2020 19:00:50219152578016.01.2020 19:00:5016.01.2020 19:01:10219152578016.01.2020 19:01:1016.01.2020 19:01:302
пар id1,id2 очень много, отдельная нумерация нужна именно для каждой пары.

Или возможно есть другой способ получить финальный результат в виде
id1id2in_movetime_stime_end19152578016.01.2020 7:54:4016.01.2020 7:55:5019152578016.01.2020 18:54:0016.01.2020 19:01:30

уже всю голову сломал)
Помогите кто может, пожалуйста)
Спасибо.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39926925
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t as
(
 select
  id1, id2, in_move, time_s, time_end,
  sum(in_move) over (partition by id1, id2 order by time_s, time_end) as g
 from
  ...
)
select
 id1, id2, in_move, min(time_s), max(time_end),
from
 t
where
 in_move = 0
group by
 g, id1, id2, in_move;
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927331
dimonovych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, но не то.
Таким образом в столбце g значение возрастает для каждой строчки и каждая строка получается отдельной группой.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927339
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonovych
Спасибо, но не то.
Да не за что.
Пока будете выполнять запросы в уме, а не на сервере, вам все будет "не то".
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927429
dimonovych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот скриншот.
В реальных данных названия столбцов другие немного и in_move инвертировано - в движении -1, стоянка 0, но суть та же.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927436
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimonovych, так разинвертируете.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927437
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonovych
В реальных данных названия столбцов другие немного и in_move инвертировано - в движении -1, стоянка 0, но суть та же.

Мда... Даете неверные исходные данные, а потом удивляетесь, что запрос неправильно работает.
Если суть та же, инвертируйте в запросе так, чтобы стоянка - что угодно, движение = 0 и будет вам счастье.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927577
dimonovych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скриншот уже для "разинвертированного" запроса.
может я и не шарю в sql но не совсем тупой уже.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927592
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimonovych
Скриншот уже для "разинвертированного" запроса.
нет
вам же всё ясно сказали
invm
чтобы стоянка - что угодно , движение = 0 и будет вам счастье.

Код: sql
1.
2.
-- sum(case when in_move = 1 then 0 else -1 end)over(...
sum(in_move-1)over(...
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927613
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimonovych,

Код: 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.
SET DATEFORMAT DMY;
WITH a (id1, id2, in_move, time_s,	time_end)
AS (
SELECT 1915,	2578,	0,	CONVERT(DATETIME, '16.01.2020 7:54:40'),	CONVERT(DATETIME, '16.01.2020 7:54:40')  UNION ALL  
SELECT 1915,	2578,	0,	'16.01.2020 7:54:40',	'16.01.2020 7:55:10'  UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 7:55:10',	'16.01.2020 7:55:20'  UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 7:55:20',	'16.01.2020 7:55:50'  UNION ALL
SELECT 1915,	2578,	1,	'16.01.2020 18:53:00',	'16.01.2020 18:54:00' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 18:54:00',	'16.01.2020 19:00:30' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 19:00:30',	'16.01.2020 19:00:50' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 19:00:50',	'16.01.2020 19:01:10' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 19:01:10',	'16.01.2020 19:01:30'
), 
c AS ( 
SELECT 
       a.id1
     , a.id2
     , a.time_s
     , a.time_end
	, RANK() OVER (ORDER BY z.time_s) AS [group]
FROM 
     a
OUTER APPLY (SELECT TOP(1) b.time_s FROM a AS b WHERE b.time_s > a.time_s AND b.in_move = 1 ORDER BY b.time_s ASC) AS z
WHERE a.in_move = 0
)
SELECT 
       c.id1
     , c.id2
     , MIN(c.time_s) AS   time_s
     , MAX(c.time_end) AS time_end
FROM 
     c
GROUP BY 
         c.id1
       , c.id2
       , c.[group]
       ORDER BY 
                time_s
              , time_end;
 
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927662
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint, в outer apply() явно не хватает условия о равенстве айдишников.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927784
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin,

Код: 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.
SET DATEFORMAT DMY;
WITH a (id1, id2, in_move, time_s,	time_end)
AS (
SELECT 1915,	2578,	0,	CONVERT(DATETIME, '16.01.2020 7:54:40'),	CONVERT(DATETIME, '16.01.2020 7:54:40')  UNION ALL  
SELECT 1915,	2578,	0,	'16.01.2020 7:54:40',	'16.01.2020 7:55:10'  UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 7:55:10',	'16.01.2020 7:55:20'  UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 7:55:20',	'16.01.2020 7:55:50'  UNION ALL
SELECT 1915,	2578,	1,	'16.01.2020 18:53:00',	'16.01.2020 18:54:00' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 18:54:00',	'16.01.2020 19:00:30' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 19:00:30',	'16.01.2020 19:00:50' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 19:00:50',	'16.01.2020 19:01:10' UNION ALL
SELECT 1915,	2578,	0,	'16.01.2020 19:01:10',	'16.01.2020 19:01:30'
), 
c AS ( 
SELECT 
       a.id1
     , a.id2
     , a.time_s
     , a.time_end
	, RANK() OVER (ORDER BY z.time_s) AS [group]
FROM 
     a
OUTER APPLY (
    SELECT TOP (1) 
		 b.time_s
    FROM 
	    a AS b
    WHERE a.id1 = b.id1
		AND a.id2 = b.id2
		AND b.time_s > a.time_s
		AND b.in_move = 1
		 ORDER BY 
				b.time_s ASC) AS z
WHERE a.in_move = 0
)
SELECT 
       c.id1
     , c.id2
     , MIN(c.time_s) AS   time_s
     , MAX(c.time_end) AS time_end
FROM 
     c
GROUP BY 
         c.id1
       , c.id2
       , c.[group]
       ORDER BY 
                time_s
              , time_end;
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927891
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint, вроде все здорово, однако: почему rank() без partition по тем же id, когда группировка с ними идет далее по порядку?
Для наглядности, набор для требуемого теста не могу подобрать.
...
Рейтинг: 0 / 0
Нумерация групп, разделенных строкой
    #39927951
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nullin
entrypoint, вроде все здорово, однако: почему rank() без partition по тем же id, когда группировка с ними идет далее по порядку?
Для наглядности, набор для требуемого теста не могу подобрать.

потому что мне нужно получить номер группы по всему списку, а не номер группы в пределах id

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- Тестовые данные 
DECLARE @t AS TABLE (id INT NOT NULL)
INSERT INTO @t(id)
SELECT 10 UNION ALL 
SELECT 10 UNION ALL 
SELECT 11 UNION ALL 
SELECT 11
  
-- Нужный результат
SELECT a.id, RANK() OVER (ORDER BY a.id) AS [group] FROM @t AS a;
-- Бессмысленный результат
SELECT a.id, RANK() OVER (PARTITION BY a.id ORDER BY a.id) AS [group] FROM @t AS a
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нумерация групп, разделенных строкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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