Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
Добрый день. Помогите пожалуйста с написанием запроса для выборки подряд идущих записей (сортировка по дате), чтобы в подгруппе с одинаковым 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
5 мар 18, 16:32    [21238318]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Поиск по форуму даст 2 ляма возможных решений
5 мар 18, 16:41    [21238354]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
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
5 мар 18, 16:41    [21238356]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
Записи перенумеровать в возрастающем и убывающем порядке. Оставить те, где номер равен единице.
5 мар 18, 16:42    [21238362]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
Дедушка,

не подойдет, я уже пробовал, получается вот такое:
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
5 мар 18, 16:56    [21238420]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
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


т.е. - порядок записей у вас тупо визуальный ?
5 мар 18, 17:02    [21238436]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
Maxx,

групировка по trackDate
5 мар 18, 17:05    [21238446]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
MAPODEP,

то есть сортировка
5 мар 18, 17:06    [21238449]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
MAPODEP
MAPODEP,

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


еслиб сортировка то выбирать надо первую и последнюю запись из списка (дедушкин подход)
если версия позволяет то можно смотреть на FISRT\LAST fisrt_value
5 мар 18, 17:10    [21238465]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
Поиск по форуму даст 2 ляма возможных решений

https://www.sql.ru/forum/1222969/generaciya-intervalo-dat?hl=first_value
5 мар 18, 17:12    [21238472]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
MAPODEP
не подойдет, я уже пробовал, получается вот такое:
top with ties
5 мар 18, 17:13    [21238484]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
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 макс
5 мар 18, 17:20    [21238512]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
MAPODEP,

Так и мы о том же.
5 мар 18, 17:23    [21238522]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING если версия 2012 и выше
5 мар 18, 17:29    [21238544]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
Maxx,

MSSQL 9.0.5000(
5 мар 18, 17:31    [21238554]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
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 макс
5 мар 18, 17:42    [21238592]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
MAPODEP,

создали Вы себе проблему, надо было группы сразу нумеровать. А теперь они существуют только в воображении.
Попробуйте пронумеровать курсором с сортировкой по дате, в теле которого ловите изменения ID.
5 мар 18, 17:49    [21238616]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
MAPODEP,

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

Что здесь может быть не так?
5 мар 18, 17:49    [21238619]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
Wlr-l,

С учетом замечания Владислав Колосов.
5 мар 18, 17:55    [21238634]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
Wlr-l,

что я не так тогда делаю?
;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
5 мар 18, 18:00    [21238650]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Wlr-l
Member

Откуда:
Сообщений: 512
MAPODEP

Ошибка в самом начале, как заметил Владислав Колосов. Устраните ее, тогда остальное будет правильно.
5 мар 18, 18:04    [21238667]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
MAPODEP
Member

Откуда:
Сообщений: 10
Wlr-l,

если бы я знал как пронумеровать курсором, я бы уже это сделал)
5 мар 18, 18:10    [21238700]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
MAPODEP
что я не так тогда делаю?

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

результат тот, что нужно?
5 мар 18, 18:16    [21238713]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
а, понял про какие вы группы :)
5 мар 18, 18:17    [21238716]     Ответить | Цитировать Сообщить модератору
 Re: Выборка подряд идущих записей  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
MAPODEP,

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;
5 мар 18, 18:54    [21238815]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить