0

次の列を持つ Messages という名前のデータベース テーブルがある場合:-

MessageID, FromUser, ToUser, Message, DateTime

「FromUser」列の個別の値を選択する SQL クエリを作成したいのですが、DateTime で並べ替えられた値も必要です。

基本的に、次のようなクエリ:

SELECT * FROM Messages WHERE ToUser='1' ORDER BY DateTime DESC

次に、次のようなもので個別の FromUser を選択します。

SELECT DISTINCT FromUser FROM Messages WHERE ToUser='1'

同時に、前のクエリからの順序を維持します。

ネストされたクエリを使用しようとしましたが、内部クエリで ORDER BY を使用できないため、問題が発生しました。

基本的に、クエリの構文で表現したい(これは無効ですが...):

SELECT DISTINCT FromUser FROM Messages WHERE ToUser=1 AND FromUser IN 
(SELECT * FROM Messages WHERE ToUser=1 ORDER BY DateTime DESC)
4

5 に答える 5

2

これがあなたが必要としているものだと思います:

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY [FromUser] ORDER BY [DateTime] DESC) RN
    FROM [Messages]
    WHERE ToUser='1' 
)
SELECT *
FROM CTE
WHERE RN = 1
于 2012-09-04T13:45:38.870 に答える
0

FromUserごとに複数のタイムスタンプがあります。それぞれに最後のタイムスタンプを使用することを想定します。

select * 
from Messages join 
    (select fromuser, MAX(datetime) as lastdate from Messages
    group by FromUser) as abb1 on abb1.FromUser = messages.FromUser and abb1.lastdate = messages.Datetime
where ToUser = '1'
order by Datetime desc
于 2012-09-04T13:49:21.213 に答える
0

したがって、ステートメントに含めるDateTimeか、グループ化するか、次のようなselect集計関数のいずれかを使用します。MAX()

    Select fromuser, datetime
    from messages
    where touser = '1'
    group by 
    fromuser, datetime
    order by 
    fromuser, datetime

また

Select fromuser, max(datetime) as max_datetime
from messages
where touser = '1'
group by 
fromuser
于 2012-09-04T13:47:06.367 に答える
0
SELECT DISTINCT [Messages].[FromUser] FROM (
SELECT [FromUser] as [FromUser], MAX(DateTime) as [Date]
FROM [Messages]
GROUP BY [FromUser]) as [Messages]
于 2012-09-04T13:50:03.550 に答える
0

別の方法;

select * from
(
    select *, max(DateTime) over (partition by FromUser) newest
    from Messages
) T
where DateTime = newest

(同一人物の同一日付の場合はn行)

于 2012-09-04T13:53:23.217 に答える