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

Откуда:
Сообщений: 3
Одна таблица
user(строка) type(число) time

Как вывести одним запросом только последние сообщения (для каждой пары user и type) меньше заданного времени?
Т.е. вывести все сообщения которые меньше заданного времени и при этом нет более поздних сообщений с такими же user и type.
15 ноя 17, 14:51    [20956324]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT T.*
FROM [Одна таблица] T
WHERE T.[time]<@time
  AND NOT EXISTS(SELECT * FROM [Одна таблица] TT WHERE TT.[user]=T.[user] AND TT.[type]=T.[type] AND TT.[time]>T.[time])
15 ноя 17, 15:06    [20956418]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
Minamoto
Member

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

select top 1 with ties [user], [type], [time]
from [table]
where [time] < @time
order by row_number() over (partition by [user], [type] order by [time] desc)
15 ноя 17, 15:07    [20956423]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Minamoto
deMax,

select top 1 with ties [user], [type], [time]
from [table]
where [time] < @time
order by row_number() over (partition by [user], [type] order by [time] desc)
Это не гарантирует, что нет более поздних записей.
(Я тоже поначалу так написал )
15 ноя 17, 15:08    [20956437]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap
Minamoto
deMax,

select top 1 with ties [user], [type], [time]
from [table]
where [time] < @time
order by row_number() over (partition by [user], [type] order by [time] desc)
Это не гарантирует, что нет более поздних записей.
(Я тоже поначалу так написал )

Я думаю, тут косяк постановщика задачи.
Если делать "Последние сообщения меньше заданного времени" - то как раз такой вариант подойдет.
Если считать, что оговорка "нет более поздних сообщений с такими же user и type" - это не ошибка, а точная постановка, тогда да, ваш вариант.
15 ноя 17, 15:13    [20956460]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
deMax
Member

Откуда:
Сообщений: 3
Спасибо большое.
Да когда спрашивал забыл дописать:
Т.е. вывести все сообщения которые меньше заданного времени и при этом нет более поздних сообщений с такими же user и type которые меньше этого же заданного времени.
15 ноя 17, 16:24    [20956925]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
deMax
Спасибо большое.
Да когда спрашивал забыл дописать:
Т.е. вывести все сообщения которые меньше заданного времени и при этом нет более поздних сообщений с такими же user и type которые меньше этого же заданного времени.
Ещё раз подумайте...
15 ноя 17, 16:29    [20956945]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
deMax, что значит "одним запросом"?
15 ноя 17, 20:48    [20957910]     Ответить | Цитировать Сообщить модератору
 Re: выбрать для каждого пользователя все последниее типы сообщений  [new]
deMax
Member

Откуда:
Сообщений: 3
andrey odegov,
У нас человек (новичок в БД), сделал в коде c++ цикл с отправкой запроса к бд.

iap,
Имхо вроде однозначно написал. Из выборки всей таблицы убрать все сообщения позже заданного времени, а потом из того что останется убрать те сообщения, для которых есть сообщения с более поздним временем и такими же user и type.

p.s. Мне это нужно знать, так как есть парные типы сообщений 1_on и 1_off, 2_on и 2_off... Т.е. если время 1_on больше 1_off или 1_on есть и нет 1_off, то флаг "1" включен в заданное время. Для всех пользователей мне нужно вывести состояние всех параметров на заданное время.
16 ноя 17, 09:35    [20958691]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить