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

Откуда:
Сообщений: 169
Добрый день,

Есть таблица в которой содержится идентификатор клиента и значение 0 или 1

Client_id int
Val tinyint

Пример данных:
Client_id Val
587 0
587 0
587 1
587 1
587 1
587 0
587 1
587 0

588 0
588 0
588 0

589 1
589 1
589 1
589 0


Каким образом можно проделать следующую нумерацию (N) - номер изменяется в том случае если меняется значение Val, если значение не изменилось номер остается прежним

Результат:

Client_id Val N
587 0 1
587 0 1
587 1 2
587 1 2
587 1 2
587 0 3
587 1 4
587 0 5

588 0 1
588 0 1
588 0 1

589 1 1
589 1 1
589 1 1
589 0 2


Получается пронумеровать при помощи lead и lag, но возможно есть какой то более высокопроизводительный способ? тк в таблице порядка 2 миллиардов записей
7 ноя 18, 15:53    [21727035]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
assmsk
Получается пронумеровать при помощи lead и lag, но возможно есть какой то более высокопроизводительный способ?
Нет
7 ноя 18, 16:00    [21727048]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
assmsk
Добрый день,

Есть таблица в которой содержится идентификатор клиента и значение 0 или 1

Client_id int
Val tinyint

Пример данных:
Client_id Val
587 0
587 0
587 1
587 1
587 1
587 0
587 1
587 0

588 0
588 0
588 0

589 1
589 1
589 1
589 0


Каким образом можно проделать следующую нумерацию (N) - номер изменяется в том случае если меняется значение Val, если значение не изменилось номер остается прежним

Результат:

Client_id Val N
587 0 1
587 0 1
587 1 2
587 1 2
587 1 2
587 0 3
587 1 4
587 0 5

588 0 1
588 0 1
588 0 1

589 1 1
589 1 1
589 1 1
589 0 2


Получается пронумеровать при помощи lead и lag, но возможно есть какой то более высокопроизводительный способ? тк в таблице порядка 2 миллиардов записей
Что определяет порядок записей? Ваш рисунок? И сервер в него заглядывает что ли?
7 ноя 18, 16:12    [21727057]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
nikit_ka
Member

Откуда:
Сообщений: 4
Добрый день!
Помогите, пожалуйста.
Проблема такая:
есть таблица (MS SQL), например:

ip| name| stat| date
10.10.10.1| aaa| 1| 01.10.2018
10.10.10.2| ввв| 1| 01.10.2018
10.10.10.3| ссс| 1| 01.10.2018
10.10.10.1| aaa| 2| 03.10.2018
10.10.10.2| ввв| 7| 03.10.2018
10.10.10.1| aaa| 3| 08.10.2018
10.10.10.4| ddd| 5| 08.10.2018

Нужно выбрать уникальные IP с максимальной датой, т.е. результат запроса д.б:
10.10.10.1| aaa| 3| 08.10.2018
10.10.10.2| ввв| 7| 03.10.2018
10.10.10.3| ссс| 1| 01.10.2018
10.10.10.4| ddd| 5| 08.10.2018

Спасибо!
14 ноя 18, 13:32    [21734116]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
_human
Member

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

group by + max
14 ноя 18, 15:06    [21734278]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
nikit_ka
Member

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

Спасибо!
Но это понятно, когда нужно выбирать 2 поля, т.е.
select ip, max(date) from aaa group by ip

как к этому прицепить остальные поля записи с максимальной датой (name, stat и еще куча)?

есть конечно мысль, но не красиво получается, например:

select * from aaa where ip+date in (select ip+max(date) from aaa group by ip)

думается, что есть более верное решение
14 ноя 18, 16:27    [21734378]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
Владислав Колосов
Member

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

поищите по форуму, вопрос много раз поднимался.
14 ноя 18, 16:40    [21734395]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
iiyama
Member

Откуда:
Сообщений: 642
nikit_ka,
declare @t table(ip varchar(20), name varchar(20) ,stat int, [date] date)
insert into @t values
('10.10.10.1','aaa', 1,'01.10.2018'),
('10.10.10.2','ввв', 1,'01.10.2018'),
('10.10.10.3','ссс', 1,'01.10.2018'),
('10.10.10.1','aaa', 2,'03.10.2018'),
('10.10.10.2','ввв', 7,'03.10.2018'),
('10.10.10.1','aaa', 3,'08.10.2018'),
('10.10.10.4','ddd', 5,'08.10.2018'),
('10.10.10.4','eee', 5,'08.10.2018')

select * from 
(
select RANK() OVER(partition by ip ORDER BY [date] DESC) as rnk, * from @t
)T
where rnk=1
14 ноя 18, 16:48    [21734401]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
nikit_ka
Member

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

Спасибо огромное!
15 ноя 18, 10:21    [21734856]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании запроса  [new]
nikit_ka
Member

Откуда:
Сообщений: 4
Спасибо всем большое!
15 ноя 18, 10:21    [21734857]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить