powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка подряд идущих записей
27 сообщений из 27, показаны все 2 страниц
Выборка подряд идущих записей
    #39610746
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Помогите пожалуйста с написанием запроса для выборки подряд идущих записей (сортировка по дате), чтобы в подгруппе с одинаковым ID выбиралась минимальная и максимальна дата Trackdate

ID TrackDate CarName
1 2018-03-02 07:00:56.000 ГАЗ 3309
1 2018-03-02 07:09:56.000 ГАЗ 3309
1 2018-03-02 07:18:56.000 ГАЗ 3309
1 2018-03-02 07:30:23.000 ГАЗ 3309
3 2018-03-02 07:30:33.000 ГАЗ 3309
3 2018-03-02 07:30:43.000 ГАЗ 3309
3 2018-03-02 07:33:15.000 ГАЗ 3309
3 2018-03-02 07:42:38.000 ГАЗ 3309
2 2018-03-02 07:42:41.000 ГАЗ 3309
2 2018-03-02 07:42:44.000 ГАЗ 3309
2 2018-03-02 07:42:58.000 ГАЗ 3309
2 2018-03-02 07:43:02.000 ГАЗ 3309
3 2018-03-02 07:43:05.000 ГАЗ 3309
3 2018-03-02 07:43:13.000 ГАЗ 3309
3 2018-03-02 07:46:03.000 ГАЗ 3309
1 2018-03-02 07:47:21.000 ГАЗ 3309
1 2018-03-02 07:47:24.000 ГАЗ 3309
1 2018-03-02 09:18:24.000 ГАЗ 3309
3 2018-03-02 09:19:03.000 ГАЗ 3309
3 2018-03-02 09:42:25.000 ГАЗ 3309
3 2018-03-02 09:57:59.000 ГАЗ 3309
3 2018-03-02 10:00:28.000 ГАЗ 3309
3 2018-03-02 10:02:51.000 ГАЗ 3309
1 2018-03-02 10:03:12.000 ГАЗ 3309
1 2018-03-02 10:03:16.000 ГАЗ 3309
1 2018-03-02 13:12:14.000 ГАЗ 3309
1 2018-03-02 13:12:21.000 ГАЗ 3309

Результат запроса должен быть таким:
1 2018-03-02 07:00:56.000 ГАЗ 3309
1 2018-03-02 07:30:23.000 ГАЗ 3309
3 2018-03-02 07:30:33.000 ГАЗ 3309
3 2018-03-02 07:42:38.000 ГАЗ 3309
2 2018-03-02 07:42:41.000 ГАЗ 3309
2 2018-03-02 07:43:02.000 ГАЗ 3309
3 2018-03-02 07:43:05.000 ГАЗ 3309
3 2018-03-02 07:46:03.000 ГАЗ 3309
1 2018-03-02 07:47:21.000 ГАЗ 3309
1 2018-03-02 09:18:24.000 ГАЗ 3309
3 2018-03-02 09:19:03.000 ГАЗ 3309
3 2018-03-02 10:02:51.000 ГАЗ 3309
1 2018-03-02 10:03:12.000 ГАЗ 3309
1 2018-03-02 13:12:21.000 ГАЗ 3309
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610753
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск по форуму даст 2 ляма возможных решений
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610754
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
row_number() over(partition by ID order by TrackDate asc) as rn1
row_number() over(partition by ID order by TrackDate desc) as rn2

оставлять только записи у которых (rn1 или rn2) = 1
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610756
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Записи перенумеровать в возрастающем и убывающем порядке. Оставить те, где номер равен единице.
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610764
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дедушка,

не подойдет, я уже пробовал, получается вот такое:
rn1 rn2 ID TrackDate CarName
58 581 3 2018-03-02 07:42:16.000 ГАЗ 3309
59 580 3 2018-03-02 07:42:21.000 ГАЗ 3309
60 579 3 2018-03-02 07:42:38.000 ГАЗ 3309
1 6 2 2018-03-02 07:42:41.000 ГАЗ 3309
2 5 2 2018-03-02 07:42:44.000 ГАЗ 3309
3 4 2 2018-03-02 07:42:58.000 ГАЗ 3309
4 3 2 2018-03-02 07:43:02.000 ГАЗ 3309
61 578 3 2018-03-02 07:43:05.000 ГАЗ 3309
62 577 3 2018-03-02 07:43:13.000 ГАЗ 3309
63 576 3 2018-03-02 07:43:25.000 ГАЗ 3309
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610767
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEPДобрый день. Помогите пожалуйста с написанием запроса для выборки подряд идущих записей (сортировка по дате), чтобы в подгруппе с одинаковым ID выбиралась минимальная и максимальна дата Trackdate

ID TrackDate CarName
1 2018-03-02 07:00:56.000 ГАЗ 3309
1 2018-03-02 07:09:56.000 ГАЗ 3309
1 2018-03-02 07:18:56.000 ГАЗ 3309
1 2018-03-02 07:30:23.000 ГАЗ 3309
1 2018-03-02 07:47:21.000 ГАЗ 3309
1 2018-03-02 07:47:24.000 ГАЗ 3309
1 2018-03-02 09:18:24.000 ГАЗ 3309
1 2018-03-02 10:03:12.000 ГАЗ 3309
1 2018-03-02 10:03:16.000 ГАЗ 3309
1 2018-03-02 13:12:14.000 ГАЗ 3309
1 2018-03-02 13:12:21.000 ГАЗ 3309

Результат запроса должен быть таким:
1 2018-03-02 07:00:56.000 ГАЗ 3309
1 2018-03-02 07:30:23.000 ГАЗ 3309
1 2018-03-02 07:47:21.000 ГАЗ 3309
1 2018-03-02 09:18:24.000 ГАЗ 3309
1 2018-03-02 10:03:12.000 ГАЗ 3309
1 2018-03-02 13:12:21.000 ГАЗ 3309

т.е. - порядок записей у вас тупо визуальный ?
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610768
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxx,

групировка по trackDate
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610770
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAPODEP,

то есть сортировка
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610774
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEPMAPODEP,

то есть сортировка

еслиб сортировка то выбирать надо первую и последнюю запись из списка (дедушкин подход)
если версия позволяет то можно смотреть на FISRT\LAST fisrt_value
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610776
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxxПоиск по форуму даст 2 ляма возможных решений
http://www.sql.ru/forum/1222969/generaciya-intervalo-dat?hl=first_value
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610779
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEPне подойдет, я уже пробовал, получается вот такое:top with ties
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610786
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxx,

поймите - мне нужно, что бы выбирало максимальную и минимальную дату по ID в пределах повторяющихся подряд записях, то есть из этого
ID TrackDate CarName
1 2018-03-02 07:00:56.000 ГАЗ 3309 мин
1 2018-03-02 07:09:56.000 ГАЗ 3309
1 2018-03-02 07:18:56.000 ГАЗ 3309
1 2018-03-02 07:30:23.000 ГАЗ 3309 макс

3 2018-03-02 07:30:33.000 ГАЗ 3309 мин
3 2018-03-02 07:30:43.000 ГАЗ 3309
3 2018-03-02 07:33:15.000 ГАЗ 3309
3 2018-03-02 07:42:38.000 ГАЗ 3309 макс

2 2018-03-02 07:42:41.000 ГАЗ 3309 мин
2 2018-03-02 07:42:44.000 ГАЗ 3309
2 2018-03-02 07:42:58.000 ГАЗ 3309
2 2018-03-02 07:43:02.000 ГАЗ 3309 макс

3 2018-03-02 07:43:05.000 ГАЗ 3309 мин
3 2018-03-02 07:43:13.000 ГАЗ 3309
3 2018-03-02 07:46:03.000 ГАЗ 3309 макс

1 2018-03-02 07:47:21.000 ГАЗ 3309 мин
1 2018-03-02 07:47:24.000 ГАЗ 3309
1 2018-03-02 09:18:24.000 ГАЗ 3309 макс

3 2018-03-02 09:19:03.000 ГАЗ 3309 мин
3 2018-03-02 09:42:25.000 ГАЗ 3309
3 2018-03-02 09:57:59.000 ГАЗ 3309
3 2018-03-02 10:00:28.000 ГАЗ 3309
3 2018-03-02 10:02:51.000 ГАЗ 3309 макс

1 2018-03-02 10:03:12.000 ГАЗ 3309 мин
1 2018-03-02 10:03:16.000 ГАЗ 3309
1 2018-03-02 13:12:14.000 ГАЗ 3309
1 2018-03-02 13:12:21.000 ГАЗ 3309 макс

получить это
ID TrackDate CarName
1 2018-03-02 07:00:56.000 ГАЗ 3309 мин
1 2018-03-02 07:30:23.000 ГАЗ 3309 макс
3 2018-03-02 07:30:33.000 ГАЗ 3309 мин
3 2018-03-02 07:42:38.000 ГАЗ 3309 макс
2 2018-03-02 07:42:41.000 ГАЗ 3309 мин
2 2018-03-02 07:43:02.000 ГАЗ 3309 макс
3 2018-03-02 07:43:05.000 ГАЗ 3309 мин
3 2018-03-02 07:46:03.000 ГАЗ 3309 макс
1 2018-03-02 07:47:21.000 ГАЗ 3309 мин
1 2018-03-02 09:18:24.000 ГАЗ 3309 макс
3 2018-03-02 09:19:03.000 ГАЗ 3309 мин
3 2018-03-02 10:02:51.000 ГАЗ 3309 макс
1 2018-03-02 10:03:12.000 ГАЗ 3309 мин
1 2018-03-02 13:12:21.000 ГАЗ 3309 макс
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610787
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAPODEP,

Так и мы о том же.
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610797
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING если версия 2012 и выше
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610801
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxx,

MSSQL 9.0.5000(
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610810
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wlr-l,

так оно считает не в подгруппе, а по всем записям

ID TrackDate CarName
1 2018-03-02 07:00:56.000 ГАЗ 3309 мин
3 2018-03-02 07:30:33.000 ГАЗ 3309 мин
2 2018-03-02 07:42:41.000 ГАЗ 3309 мин
2 2018-03-02 07:43:02.000 ГАЗ 3309 макс
3 2018-03-02 10:02:51.000 ГАЗ 3309 макс
1 2018-03-02 13:12:21.000 ГАЗ 3309 макс
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610819
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEP,

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

Дедушка все написал: группировка по ID, сортировка по TrackDate в двух направлениях, фильтрация нужных записей.

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

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

что я не так тогда делаю?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
;with Table1 as (
    select
		row_number() over(partition by ID order by TrackDate asc) as rn1,
		row_number() over(partition by ID order by TrackDate desc) as rn2, *
    from trackhistorytmp
)
select *
from Table1 t
where t.rn1=1 or t.rn2=1
order by trackdate
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610830
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAPODEP

Ошибка в самом начале, как заметил Владислав Колосов. Устраните ее, тогда остальное будет правильно.
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610838
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wlr-l,

если бы я знал как пронумеровать курсором, я бы уже это сделал)
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610841
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEPчто я не так тогда делаю?
Код: 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.
declare @t table(ID int, TrackDate datetime, CarName varchar(10))

insert @t
(ID, TrackDate, CarName)
values
(1,	'2018-03-02 07:00:56.000',	' 3309'),
(1,	'2018-03-02 07:09:56.000',	' 3309'),
(1,	'2018-03-02 07:18:56.000',	' 3309'),
(1,	'2018-03-02 07:30:23.000',	' 3309'),
(3,	'2018-03-02 07:30:33.000',	' 3309'),
(3,	'2018-03-02 07:30:43.000',	' 3309'),
(3,	'2018-03-02 07:33:15.000',	' 3309'),
(3,	'2018-03-02 07:42:38.000',	' 3309'),
(2,	'2018-03-02 07:42:41.000',	' 3309'),
(2,	'2018-03-02 07:42:44.000',	' 3309'),
(2,	'2018-03-02 07:42:58.000',	' 3309'),
(2,	'2018-03-02 07:43:02.000',	' 3309'),
(3,	'2018-03-02 07:43:05.000',	' 3309'),
(3,	'2018-03-02 07:43:13.000',	' 3309'),
(3,	'2018-03-02 07:46:03.000',	' 3309')

;with tt as (
    select
		row_number() over(partition by ID order by TrackDate asc) as rn1,
		row_number() over(partition by ID order by TrackDate desc) as rn2, *
    from @t
)

select 
ID, TrackDate, CarName
from 
tt
where
rn1=1 or rn2=1
order by
ID, TrackDate

1	2018-03-02 07:00:56.000	 3309
1	2018-03-02 07:30:23.000	 3309
2	2018-03-02 07:42:41.000	 3309
2	2018-03-02 07:43:02.000	 3309
3	2018-03-02 07:30:33.000	 3309
3	2018-03-02 07:46:03.000	 3309


результат тот, что нужно?
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610843
Фотография Дедушка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, понял про какие вы группы :)
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610862
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEP,

Код: 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.
declare @t table (ID int, TrackDate datetime, CarName varchar(30));

insert into @t
select  1,'20180302 07:00:56.000',  'ГАЗ 3309' union all
select  1,' 20180302 07:09:56.000',  'ГАЗ 3309' union all
select  1,' 20180302 07:18:56.000',  'ГАЗ 3309' union all
select  1,' 20180302 07:30:23.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:30:33.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:30:43.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:33:15.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:42:38.000',  'ГАЗ 3309' union all
select  2,' 20180302 07:42:41.000',  'ГАЗ 3309' union all
select  2,' 20180302 07:42:44.000',  'ГАЗ 3309' union all
select  2,' 20180302 07:42:58.000',  'ГАЗ 3309' union all
select  2,' 20180302 07:43:02.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:43:05.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:43:13.000',  'ГАЗ 3309' union all
select  3,' 20180302 07:46:03.000',  'ГАЗ 3309' union all
select  1,' 20180302 07:47:21.000',  'ГАЗ 3309' union all
select  1,' 20180302 07:47:24.000',  'ГАЗ 3309' union all
select  1,' 20180302 09:18:24.000',  'ГАЗ 3309' union all
select  3,' 20180302 09:19:03.000',  'ГАЗ 3309' union all
select  3,' 20180302 09:42:25.000',  'ГАЗ 3309' union all
select  3,' 20180302 09:57:59.000',  'ГАЗ 3309' union all
select  3,' 20180302 10:00:28.000',  'ГАЗ 3309' union all
select  3,' 20180302 10:02:51.000',  'ГАЗ 3309' union all
select  1,' 20180302 10:03:12.000',  'ГАЗ 3309' union all
select  1,' 20180302 10:03:16.000',  'ГАЗ 3309' union all
select  1,' 20180302 13:12:14.000',  'ГАЗ 3309' union all
select  1,' 20180302 13:12:21.000',  'ГАЗ 3309';

with t as
(
 select
  ID, CarName, TrackDate,
  row_number() over (order by TrackDate) - row_number() over (partition by ID order by TrackDate) as g
 from
  @t
)
select
 a.ID, a.CarName, b.dt
from
 (select g, ID, CarName, min(TrackDate), max(TrackDate) from t group by ID, CarName, g) a(g, ID, CarName, min_dt, max_dt) cross apply
 (select a.min_dt union all select a.max_dt) b(dt)
order by
 a.g, a.ID, b.dt;
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39610953
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAPODEP,

Код: 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.
declare @t table(ID int, TrackDate datetime, CarName varchar(10))

insert @t
(ID, TrackDate, CarName)
values
(1,	'2018-03-02 07:00:56.000',	' 3309'),
(1,	'2018-03-02 07:09:56.000',	' 3309'),
(1,	'2018-03-02 07:18:56.000',	' 3309'),
(1,	'2018-03-02 07:30:23.000',	' 3309'),
(3,	'2018-03-02 07:30:33.000',	' 3309'),
(3,	'2018-03-02 07:30:43.000',	' 3309'),
(3,	'2018-03-02 07:33:15.000',	' 3309'),
(3,	'2018-03-02 07:42:38.000',	' 3309'),
(2,	'2018-03-02 07:42:41.000',	' 3309'),
(2,	'2018-03-02 07:42:44.000',	' 3309'),
(2,	'2018-03-02 07:42:58.000',	' 3309'),
(2,	'2018-03-02 07:43:02.000',	' 3309'),
(3,	'2018-03-02 07:43:05.000',	' 3309'),
(3,	'2018-03-02 07:43:13.000',	' 3309'),
(3,	'2018-03-02 07:46:03.000',	' 3309')


Select a.* From @t a
outer apply (Select top 1 b.ID from @t b Where a.TrackDate > b.TrackDate Order by b.TrackDate Desc) Prev
outer apply (Select top 1 b.ID from @t b Where a.TrackDate < b.TrackDate Order by b.TrackDate ) Next
Where isnull(prev.ID,-1)<>a.ID or isnull(next.ID,-1)<>a.ID
...
Рейтинг: 0 / 0
Выборка подряд идущих записей
    #39611022
MAPODEP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое, все работает
...
Рейтинг: 0 / 0
27 сообщений из 27, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка подряд идущих записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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