Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нумерация групп, разделенных строкой / 14 сообщений из 14, страница 1 из 1
14.02.2020, 21:14
    #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
14.02.2020, 21:33
    #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
17.02.2020, 11:10
    #39927331
dimonovych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
Спасибо, но не то.
Таким образом в столбце g значение возрастает для каждой строчки и каждая строка получается отдельной группой.
...
Рейтинг: 0 / 0
17.02.2020, 11:22
    #39927339
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
dimonovych
Спасибо, но не то.
Да не за что.
Пока будете выполнять запросы в уме, а не на сервере, вам все будет "не то".
...
Рейтинг: 0 / 0
17.02.2020, 13:11
    #39927429
dimonovych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
Вот скриншот.
В реальных данных названия столбцов другие немного и in_move инвертировано - в движении -1, стоянка 0, но суть та же.
...
Рейтинг: 0 / 0
17.02.2020, 13:17
    #39927436
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
dimonovych, так разинвертируете.
...
Рейтинг: 0 / 0
17.02.2020, 13:17
    #39927437
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
dimonovych
В реальных данных названия столбцов другие немного и in_move инвертировано - в движении -1, стоянка 0, но суть та же.

Мда... Даете неверные исходные данные, а потом удивляетесь, что запрос неправильно работает.
Если суть та же, инвертируйте в запросе так, чтобы стоянка - что угодно, движение = 0 и будет вам счастье.
...
Рейтинг: 0 / 0
17.02.2020, 17:10
    #39927577
dimonovych
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
Скриншот уже для "разинвертированного" запроса.
может я и не шарю в sql но не совсем тупой уже.
...
Рейтинг: 0 / 0
17.02.2020, 17:26
    #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
17.02.2020, 18:02
    #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
17.02.2020, 21:00
    #39927662
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
entrypoint, в outer apply() явно не хватает условия о равенстве айдишников.
...
Рейтинг: 0 / 0
18.02.2020, 09:50
    #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
18.02.2020, 12:07
    #39927891
nullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нумерация групп, разделенных строкой
entrypoint, вроде все здорово, однако: почему rank() без partition по тем же id, когда группировка с ними идет далее по порядку?
Для наглядности, набор для требуемого теста не могу подобрать.
...
Рейтинг: 0 / 0
18.02.2020, 13:38
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нумерация групп, разделенных строкой / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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