4

SQL Server 2008 の次のデータベース テーブルについて考えてみます。

ActionID (PK)    ActionType    ActionDate              UserID  ContentID
1                'Create'      '2013-05-26 18:40:00'   1       10
2                'Create'      '2013-05-26 18:30:00'   2       10
3                'Edit'        '2013-05-26 12:30:00'   5       12
4                'Edit'        '2013-05-26 12:25:00'   5       12
5                'Delete'      '2013-05-26 12:22:00'   6       12

ContentIDandでグループ化する SQL クエリを作成したいのですがActionType、最新ActionDateの行が返され、他の行UserIDの値が異なる場合でも無視されます。

したがって、返されるものは次のとおりです。

ActionID (PK)    ActionType    ActionDate              UserID  ContentID
1                'Create'      '2013-05-26 18:40:00'   1       10
3                'Edit'        '2013-05-26 12:30:00'   5       12
5                'Delete'      '2013-05-26 12:22:00'   6       12

しかし、それを行うためのクエリの書き方がよくわかりません。

4

2 に答える 2

7

1 つのアプローチは、CTE (Common Table Expression) を使用することです。

この CTE を使用すると、データをいくつかの基準 (ContentIDと など) で分割Actiontypeし、SQL Server に、これらの「パーティション」ごとに 1 から始まるすべての行をActionDate.

だから、次のようなことを試してください:

;WITH Actions AS
(
   SELECT 
       ActionID, ActionType, ActionDate, UserID, ContentID,
       RowNum = ROW_NUMBER() OVER(PARTITION BY ContentID, ActionType ORDER BY ActionDate DESC)
   FROM 
       dbo.YourTable
   WHERE
      ......
)
SELECT 
   ActionID, ActionType, ActionDate, UserID, ContentID,
FROM 
   Actions
WHERE
   RowNum = 1
ORDER BY 
   ActionDate DESC

それはあなたが探しているものに近づきますか??

于 2013-05-26T17:04:52.810 に答える