2012-04-03 2 views
2

У меня есть таблица, которая содержит сообщения от пользователей и от пользователей. Как я могу использовать SQL для выбора всех сообщений, отправленных пользователем. Я хочу сгруппировать результаты с помощью MessageSenderUserID. Я также хочу вернуть только самого последнего получателя.Выберите последнее (вверху 1) из таблицы, сгруппированной по другому ID

Я попытался использовать MAX в условии наличия, но, похоже, это не правильное решение.

я могу лучше всего описать как комбинацию из следующих запросов:

SELECT TOP 1 MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID 
FROM [Messaging_Message] 
WHERE MessageSenderUserID = 799 
ORDER BY MessageSent DESC 

SELECT MessageSenderUserID 
FROM [Messaging_Message] 
GROUP BY MessageSenderUserID 

Спасибо!

+1

Можете ли вы опубликовать некоторые данные образца и желаемый o/p – Teja

ответ

5

Я ве только недавно узнали об этом (самом удивительном & прикольного) способа получения топа 1 пункта в группе:

select top 1 with ties 
    MessageID, 
    MessageSent, 
    MessageSenderUserID, 
    MessageRecipientUserID 
from [Messaging_Message] 
order by row_number() over (partition by MessageSenderUserID 
          order by MessageSent desc) 

Уловка находится в порядке - результаты группируются в разделе по частям и упорядочены по ключу сортировки, в результате каждая группа получает номер 1 для первой строки. With ties возвращает все. О, радость прикладного механика!

+0

это является удивительным, но как же я не могу сделать: «выберите верхний 1 со связями MESSAGEID, MessageSent, MessageSenderUserID, MessageRecipientUserID из [Messaging_Message] ORDER BY MessageSent ... '@Nikola Markovinović – Hoppe

+1

Поскольку MessageSent имеет разные значения для разных идентификаторов MessageSenderUserID. row_number() присваивает 1 каждому верхнему MessageSent, переводящему ates в свое положение по убыванию, тогда верхний 1 с привязками выбирает только строки, имеющие row_number = 1. Это особый случай, вы даже не можете сказать select top 2 ... Он работает для наивысшего значения только для каждой группы. –

0

Это предполагает, что пользователь не может отправить более одного сообщения в одно и то же время (он будет показывать более одного сообщения для пользователя в этом случае):

SELECT a.MessageID, a.MessageSent, a.MessageSenderUserID, a.MessageRecipientUserID 
FROM Messaging_Message AS a 
    JOIN (
     SELECT MessageSenderUserID, MAX(MessageSent) AS MessageSent 
     FROM Messaging_Message 
     GROUP BY MessageSenderUserID 
    ) AS b ON a.MessageSenderUserID = b.MessageSenderUserID 
     AND a.MessageSent = b.MessageSent 
1
WITH TestTableCTE AS 
(
    SELECT RN = ROW_NUMBER() OVER(PARTITION BY MessageSenderUserID ORDER BY MessageSent DESC), 
      MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID 
    FROM [Messaging_Message] 
) 

SELECT MessageID, MessageSent, MessageSenderUserID, MessageRecipientUserID FROM TestTableCTE WHERE RN=1 
+0

, если я поставлю предложение where на выбор внутри оператора with, чтобы дифференцировать каждого пользователя, а затем иметь доступ к параллельным пользователям, будут ли у меня проблемы? Я новичок в результате темп задает – Hoppe

Смежные вопросы