1

Microsoft SQLServer2008にデータベースがあります

[eventlog].[dbo].[USER_OPERATION]列のあるテーブルがあります[userID], [event_description], [event_date], [event_type], [eventID]

eventID発生する可能性のあるすべての特定のイベントに固有です。

もちろん、特定UserIDのユーザーはイベントに固有ではありませんが(すべてのユーザーが自分に関連付けられたイベントを多数持つ可能性があります)、1人の個々のユーザーに関連付けられます。

私が欲しいのは、すべてのユーザー(つまり、every )の最新のUserIDイベントとそれに関連する情報(および特定のイベントの)event_typeのみを含むリストを提供するクエリを作成することです。eventIDevent_description

説明する:

演奏するとき

SELECT * 
FROM [eventlog].[dbo].[USER_OPERATION] 
ORDER BY userID ASC

私はの線に沿って何かを得る

|====================================================================================|
|  eventID  |  userID  |        event_description        |  event_date  | event_type |
|           |          |                                 |              |            |
|   123     |    2     |  USER 2 broke something         |  03.11.11    |   CRASH    |
|   391     |    2     |  USER 2 filed a complaint       |  30.04.10    |  COMPLAINT |
|   392     |    2     |  USER 2 has bought beer         |  31.10.09    |  PURCHASE  |
|   32      |    3     |  USER 3 broke something         |  22.10.11    |   CRASH    |
|   568     |    4     |  USER 4 has requested support   |  05.12.11    |  SUPP_REQ  |
|   691     |    4     |  USER 4 has bought beer         |  01.12.10    |  PURCHASE  |
|   81      |    4     |  USER 4 updated personal data   |  17.07.11    |  PDAT_UPD  |
|   141     |    5     |  USER 5 has bought beer         |  16.08.11    |  PURCHASE  |
|   142     |    5     |  USER 5 broke something         |  16.08.11    |   CRASH    |
|   269     |    6     |  USER 6 updated personal data   |  27.01.12    |  PDAT_UPD  |
|   845     |    7     |  USER 7 updated personal data   |  27.01.12    |  PDAT_UPD  |
|           |          |                                 |              |            |
|====================================================================================|

ご覧のとおり、一部のユーザーには、日付が異なる複数のイベントが関連付けられています。

私が欲しいのは、ユーザーのリストと、ユーザーがイベントを起こした最新の日付を表示するクエリです(出力は、基本的に、各ユーザーを1回リストし、に関連付けられた最新のイベントを表示するテーブルになります各ユーザー、および関連するevent_description、event_date、event_type info)。

このようなクエリ結果を「最近のイベントテーブル」と呼びましょう。

同じ日に何かを壊してビールを購入したユーザー5(ユーザーID 5)の「異常な状態」に注意してください。

そのような場合、2つの同じ日のイベントのどちらが「最近のイベントテーブル」に入るかは関係ありません。ランダムまたは何でも選択できます(ただし、関連するevent_descriptionおよびevent_type情報が必要です)。

理想的には、結果は次のようになります(上記と同じユーザーセットの場合)。

|====================================================================================|
|  eventID  |  userID  |        event_description        |  event_date  | event_type |
|           |          |                                 |              |            |
|   123     |    2     |  USER 2 broke something         |  03.11.11    |   CRASH    |
|   32      |    3     |  USER 3 broke something         |  22.10.11    |   CRASH    |
|   568     |    4     |  USER 4 has requested support   |  05.12.11    |  SUPP_REQ  |
|   141     |    5     |  USER 5 has bought beer         |  16.08.11    |  PURCHASE  |
|   269     |    6     |  USER 6 updated personal data   |  27.01.12    |  PDAT_UPD  |
|   845     |    7     |  USER 7 updated personal data   |  27.01.12    |  PDAT_UPD  |
|           |          |                                 |              |            |
|====================================================================================|

ユーザー5のような「日付重複」に対して「2つのうちのいずれかをランダムにまたは何らかのルールに従って選択する」方法がない場合、「最近のイベントテーブル」に2つのエントリがあることは、このような特殊なケースでは許容されます。それらは非常にまれであり、私はそれらを手動で処理できます。

そのような(少し幸運ではない)場合、「最近のイベントテーブル」は次のようになります。

|====================================================================================|
|  eventID  |  userID  |        event_description        |  event_date  | event_type |
|           |          |                                 |              |            |
|   123     |    2     |  USER 2 broke something         |  03.11.11    |   CRASH    |
|   32      |    3     |  USER 3 broke something         |  22.10.11    |   CRASH    |
|   568     |    4     |  USER 4 has requested support   |  05.12.11    |  SUPP_REQ  |
|   141     |    5     |  USER 5 has bought beer         |  16.08.11    |  PURCHASE  |
|   142     |    5     |  USER 5 broke something         |  16.08.11    |   CRASH    |
|   269     |    6     |  USER 6 updated personal data   |  27.01.12    |  PDAT_UPD  |
|   845     |    7     |  USER 7 updated personal data   |  27.01.12    |  PDAT_UPD  |
|           |          |                                 |              |            |
|====================================================================================|

これも許容されます(ただし、後で少し追加の剪定が必要になります)。

それで、私の質問を要約すると、上記の内容に沿って最近のイベントテーブルを取得するようなMicrosoft SQLクエリを作成することは可能ですか?

よろしくお願いします

4

2 に答える 2

1

CTE(共通テーブル式ROW_NUMBER())を次の関数と組み合わせて使用​​できます。

;WITH CTE AS 
(
    SELECT  
       *,
       RowNum = ROW_NUMBER() OVER (PARTITION BY UserID 
                                   ORDER BY event_date DESC, event_id DESC)
    FROM [eventlog].[dbo].[USER_OPERATION] 
)
SELECT *
FROM CTE
WHERE RowNum = 1

これにより、データがグループに「分割」され(1つずつ)、そのUserIDデータのグループ内のイベントがとで並べ替えられevent_date DESCevent_id DESC番号が付けられます(各ユーザーの最新のエントリが取得されます)。RowNum = 1したがって、CTEからそれらを選択するだけです。完了です!

于 2012-11-07T09:39:04.827 に答える
0
DECLARE @USER_OPERATION table 
(
eventID int,
userID int,
event_description nvarchar(250),
event_date date,
event_type nvarchar(250)
)
Insert into @USER_OPERATION values  (123,2,'USER 2 broke something','11/03/11','CRASH')
Insert into @USER_OPERATION values  (391,2,'USER 2 filled a complaint','04/30/10','COMPLAINT')
Insert into @USER_OPERATION values  (392,2,'USER 2 bought beer','10/31/09','PURCHASE')
Insert into @USER_OPERATION values  (32,3,'USER 3 broke something','10/22/11','CRASH')
Insert into @USER_OPERATION values  (568,4,'USER 4 has requested support','12/05/11','SUPP_REQ')
Insert into @USER_OPERATION values  (691,4,'USER 4 has bought beer','12/01/10','PURCHASE ')
Insert into @USER_OPERATION values  (81,4,'USER 4 updated personal data','07/17/11','PDAT_UPD ')
Insert into @USER_OPERATION values  (141,5,' USER 5 has bought beer','08/16/11','PURCHASE')
Insert into @USER_OPERATION values  (142,5,' USER 5 broke something','08/16/11','CRASH')
Insert into @USER_OPERATION values  (269,6,'USER 6 updated personal data','01/27/12','PDAT_UPD')
Insert into @USER_OPERATION values  (845,7,'USER 7 updated personal data ','01/27/12','PDAT_UPD')


SELECT * FROM @USER_OPERATION AS userOp INNER JOIN
(SELECT DISTINCT userID, (SELECT Top 1 eventID FROM @USER_OPERATION a WHERE a.userID  =B.userID ORDER BY event_date DESC)as eventID
from @USER_OPERATION AS B) as tbl 
ON userOp.userID =tbl.userID and userOp.eventID =tbl.eventID
于 2012-11-07T10:04:23.180 に答える