3

更新 - 質問

自己結合を使用する以外に、テーブルから最大のレコードを選択するクエリをよりコンパクトに作成する方法はありますか?

例として、次のスキーマを持つイベントのテーブルがあります。

   EventID | EventType | Timestamp | Description
-----------+-----------+-----------+--------------
   INT     | VARCHAR   | INT       | VARCHAR

また、イベントの種類ごとに複数のレコードが含まれる場合があります。まあ言ってみれば:

     1     |    A      |  100000   | 'First Event'
     2     |    A      |  100005   | 'Second Event'
     3     |    B      |  100009   | 'Third Event'
     4     |    A      |  100009   | 'Fourth Event'
     5     |    B      |  100010   | 'Fifth Event'
     6     |    B      |  100030   | 'Sixth Event'
     7     |    A      |  100030   | ' ... '
     8     |    C      |  100030   | ' ... '
     9     |    C      |  100050   | ' ... '

そして、各タイプの最新のイベント (イベント #6、#7、および #9) を知りたいとしましょう。次に、次のようなクエリを作成する必要があります。

SELECT EventID
     , EventType
     , Timestamp
     , Description
  FROM EventsTable T
 INNER JOIN (SELECT EventType
                  , MAX(Timestamp) 
               FROM EventsTable TInner
              GROUP BY EventType) TSelf
         ON T.Timestamp = TSelf.Timestamp
         AND T.EventType = TSelf.EventType

したがって、質問は次のようになります。理想的には JOIN に頼ることなく、同じクエリを表現するよりコンパクトな方法はありますか?

4

4 に答える 4

1

これを試して..

SELECT EventID, EventType, Timestamp, Description
FROM EventsTable
WHERE EventType = 'B' AND 
      Timestamp = (SELECT max(Timestamp) FROM EventsTable WHERE EventType = 'B');
于 2013-03-02T20:28:15.010 に答える
0

返されるのに1行だけ必要であることに気づいていませんでした。Common Table Expressionを使用して、目的の結果を達成します。シンプルでクリーン。

;WITH CTE
AS
(
    SELECT EventID, 
           EventType, 
           Timestamp,
           Description
    FROM EventsTable 
    WHERE EventType = 'B'
)

SELECT TOP 1 * FROM CTE 
ORDER BY TIMESTAMP DESC
于 2013-03-02T20:15:29.827 に答える
0
SELECT EventID, EventType, Timestamp, Description
FROM EventsTable T
WHERE T.EventType = 'B'
ORDER BY Timestamp
LIMIT 1

トリックを実行する必要があります(LIMITをサポートするDBMSの場合)。

于 2013-03-02T20:10:43.547 に答える
0

order by を使用したくない場合は、次のようにします。

SELECT * FROM EventsTable WHERE EventType = 'B' AND
Timestamp = (SELECT Max(Timestamp) FROM EventsTable WHERE EventType = 'B');

order by が OK の場合:

Mysql:

SELECT * FROM EventsTable WHERE EventType = 'B' ORDER BY Timestamp DESC LIMIT 1;

SQLサーバー:

SELECT TOP 1 * FROM EventsTable WHERE EventType = 'B' ORDER BY Timestamp DESC

フィドルを参照してください。

于 2013-03-02T20:48:34.080 に答える