Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 distinct top(N) ... order by  [new]
VIT2708_
Guest
Подскажите каким образом можна написать такой запрос

Table1 - это таблица сообщений (ID, ClientName, DateRecord, ....)
Table2 - таблица клиентов (ID, clientID, Message, ...)


select distinct top(5) t2.ClientName, t1.Message, ...
from Table1 t1
    left join Table2 t2 on t1.clientID=t2.clientID
where t2.operatorId=1
order by t1.DateRecord desc, ....



Я хочу выбрать 5 последних клиентов которые написали сообщения обработанных оператором.
Если убрать distinct то клиент дублируется.
Но не могу придумать как это сделать из-за ошибки ORDER BY items must appear in the select list if SELECT DISTINCT is specified

Спасибо.
30 сен 16, 11:23    [19727121]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
Rankatan
Member

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

select distinct .... from
(
select top(5) DateRecord ,t2.ClientName, t1.Message, ...
from Table1 t1
    left join Table2 t2 on t1.clientID=t2.clientID
where t2.operatorId=1
order by t1.DateRecord desc, ....
) G
30 сен 16, 12:22    [19727617]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
VIT2708_
Guest
Rankatan,

Я так пробовал, клиенты дублируются
30 сен 16, 12:34    [19727700]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
o-o
Guest
словами написано одно, кодом другое.
если выбираются клиенты с сообщениями, то ничего не стОит и дату выбрать.
если же только клиенты, то зачем сообщение в списке выбора?
---
похоже, ТС хочет ТОЛьКО клиентов, без подробностей,
но может выйти так, что один и тот же клиент как раз и послал последние 5 сообщений.
тогда ТС (и Ранкатан тоже) сортируют по дате, выбирают 5 последних сообщений,
но автор у всех один и тот же
---
у сервера, кстати, та же самая проблема.
нельзя выбрать гарантированно различных,
если поле сортировки не входит в поля отбора.
мы же по дате упорядочили, не по клиенту.
30 сен 16, 12:53    [19727821]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
order by ROW_NUMBER() over(order by t1.DateRecord desc, ....)
30 сен 16, 12:57    [19727841]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
VIT2708_
Guest
o-o,

мне сообщения не нужны мне нужно 5 последних клиентов которые писали сообщения. Может запрос неверно составил. Я просто найти правильный вариант
30 сен 16, 13:02    [19727893]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
o-o
Guest
TaPaK
order by ROW_NUMBER() over(order by t1.DateRecord desc, ....)

та же ошибка и будет.
и синтаксически, и логически.
ну вот какие-то данные.
всего 6 клиентов, 5 из них нужны в выборке.
вот обоими способами вы получите клиентов 5,6
только потому, что именно эти 2 посылали последними.
можно сделать, чтобы вообще только один был отправителем последних пяти
declare @t table (clientID int, Msg varchar(100), DateRecord datetime);
insert into @t values
(1, 'a', '20000101'), (1, 'b', '20010102'),(1, 'c', '20020103'),
(2, 'a', '20000102'), (2, 'b', '20010102'),(2, 'c', '20020103'),
(3, 'a', '20000101'), (3, 'b', '20000101'),(3, 'c', '20000101'),
(4, 'a', '20000101'), (4, 'b', '20010101'),(4, 'c', '20020101'),
(5, 'a', '20000101'), (5, 'b', '20070101'),(5, 'c', '20080101'),
(6, 'a', '20090101'), (6, 'b', '20100101'),(6, 'c', '20110101')


select distinct top(5) clientID, Msg, DateRecord
from @t 
order by DateRecord desc

select ROW_NUMBER() over(order by DateRecord desc), *
from @t 
order by ROW_NUMBER() over(order by DateRecord desc)
30 сен 16, 13:11    [19727983]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
VIT2708_
o-o,

мне сообщения не нужны мне нужно 5 последних клиентов которые писали сообщения. Может запрос неверно составил. Я просто найти правильный вариант
Значит, надо в подзапросе выбрать записи с максимальной датой для каждого клиента, а из них - первые 5.
SELECT TOP(5) * FROM
(
 SELECT TOP(1) WITH TIES t1.DateRecord, t2.ClientName, t1.Message, ...
 FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.clientID=t2.clientID 
 WHERE t2.operatorId=1
 ORDER BY ROW_NUMBER()OVER(PARTITION BY t1.clientID ORDER BY t1.DateRecord DESC)
) T
ORDER BY DateRecord DESC;
Не проверял!
30 сен 16, 13:15    [19728019]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
VIT2708_
Guest
iap
VIT2708_
o-o,

мне сообщения не нужны мне нужно 5 последних клиентов которые писали сообщения. Может запрос неверно составил. Я просто найти правильный вариант
Значит, надо в подзапросе выбрать записи с максимальной датой для каждого клиента, а из них - первые 5.
SELECT TOP(5) * FROM
(
 SELECT TOP(1) WITH TIES t1.DateRecord, t2.ClientName, t1.Message, ...
 FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.clientID=t2.clientID 
 WHERE t2.operatorId=1
 ORDER BY ROW_NUMBER()OVER(PARTITION BY t1.clientID ORDER BY t1.DateRecord DESC)
) T
ORDER BY DateRecord DESC;
Не проверял!



Это то что надо. Спасибо
30 сен 16, 13:51    [19728383]     Ответить | Цитировать Сообщить модератору
 Re: distinct top(N) ... order by  [new]
o-o
Guest
iap
VIT2708_
o-o,

мне сообщения не нужны мне нужно 5 последних клиентов которые писали сообщения. Может запрос неверно составил. Я просто найти правильный вариант
Значит, надо в подзапросе выбрать записи с максимальной датой для каждого клиента, а из них - первые 5.
SELECT TOP(5) * FROM
(
 SELECT TOP(1) WITH TIES t1.DateRecord, t2.ClientName, t1.Message, ...
 FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.clientID=t2.clientID 
 WHERE t2.operatorId=1
 ORDER BY ROW_NUMBER()OVER(PARTITION BY t1.clientID ORDER BY t1.DateRecord DESC)
) T
ORDER BY DateRecord DESC;
Не проверял!

да, вот так все правильно
30 сен 16, 13:51    [19728386]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить