2

多くの返信や同様の質問を読みましたが、自分の状況に適用できないようです。平均して 10,000 レコードで、常に変化しているテーブルがあります。deviceIDこれには、約 20 の一意の値を持つと呼ばれる列、 と とdateAndTimeを含む他の多くの列が含まstatus1status2ます。最新の dateAndTime を持つレコードを表示して、deviceID ごとに 1 つのインスタンスを分離する必要があります。これは、次を使用してうまく機能します。

select DISTINCT deviceID, MAX(dateAndTime)
from MyTable 
Group By deviceID 
ORDER BY MAX(dateAndTime) DESC 

(上記のステートメントからDISTINCTを省略しても同じ結果が得られることに気付きました)

ただし、このステートメントを展開してフィールド ステータス フィールドを含めることはできません。ステートメントにエラーが発生したり、結果が正しくなかったりすることはありません。INEXISTSおよび構文を使用して行を分離しようとしましたが、すべてうまくいきませんでした。結果に一意の deviceID、最新のレコードの日付、およびstatusそれらの一意のレコードに関連付けられた対応するフィールドが表示されるように、このクエリをネストまたは書き直す方法を考えています。

4

2 に答える 2

1

DeviceID + DateAndTime が UNIQUE であることを保証できる場合は、次のことができます。

SELECT * 
FROM 
    MyTable as T1, 
    (SELECT DeviceID, max(DateAndTime) as mx FROM MyTable group by DeviceID) as T2 
WHERE 
    T1.DeviceID  = T2.DeviceID AND 
    T1.DateAndTime = T2.mx

したがって、基本的には、DeviceID で group by を実行することになります (注: GROUP BY は常に集計関数と一緒に使用されます。この場合は MAX を使用しています)。次に、クエリをテーブルに結合し、WHERE 句に DeviceID + DateAndTime を追加します。

補足事項... GROUP BY は、デフォルトですべての行が異なるため、DISTINCT を追加してもしなくても、個別の要素を返します。

于 2013-07-09T06:40:11.223 に答える
0

多分:

SELECT a.*
FROM( SELECT DISTINCT *,
      ROW_NUMBER() OVER (PARTITION BY deviceID ORDER BY dateAndTime DESC) as rown
      FROM MyTable ) a
WHERE a.rown = 1
于 2013-07-09T06:15:49.037 に答える