0

グループ内の最新のタイムスタンプから5分以内に発生する行をグループ化する方法を見つける必要があり、displayidとobjectidは同じです.....

CREATE TABLE [dbo].[ExampleLog](
  [ID] [uniqueidentifier] NOT NULL,
  [EVENTNUMBER] [int] NULL,
  [DISPLAYSERIAL] [int] NULL,
  [DISPLAYID] [varchar](50) NULL,
  [OBJECTSERIAL] [int] NULL,
  [OBJECTRSSILEVEL] [int] NULL,
  [OBJECTID] [varchar](50) NULL,
  [TIMESTAMP] [datetime] NULL)

INSERT INTO [dbo].[ExampleLog]
VALUES 
  (NewID(), 206, 6897913, 'HV 644', 6885819, 66, 'WAP 8', '2012-01-01 12:12:00'),
  (NewID(), 206, 6897913, 'HV 644', 6885819, 66, 'WAP 8', '2012-01-01 12:13:00'),
  (NewID(), 206, 6897913, 'HV 644', 6877807, 54, 'MV 20', '2012-01-01 12:16:00'),
  (NewID(), 103, 6897913, 'HV 644', 6898052, 118, 'HV 62', '2012-01-01 12:20:00'),
  (NewID(), 206, 6897913, 'HV 644', 6886130, 122, 'HV 62', '2012-01-01 12:21:00'),
  (NewID(), 206, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:25:00'),
  (NewID(), 204, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:31:00'),
  (NewID(), 204, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:33:00'),
  (NewID(), 104, 6897913, 'HV 644', 6886130, 106, 'HV 62', '2012-01-01 12:39:00')

したがって、上記のデータセットを使用すると、私の結果は理想的には次のようにグループ化されます。

行1と行2はグループ化されています。これは、objectidとdisplayidが同じであり、行2が行1から5分以内に発生するためです。データセットには、同じdisplayidとobjectidと、グループの最新の5分以内のタイムスタンプを含む他の行はありません。タイムスタンプ(行2)そう..

データセットには、最新のタイムスタンプ(行3)から5分以内にdisplayidとobjectidが一致する行がないため、行3は単独でグループ化されます。

行4、5、および6は、displayidの一致、objectidの一致、および行のタイムスタンプが最後の行から5分以内、行5のタイムスタンプが行4の5分以内、行6のタイムスタンプが行の5分以内であるためにグループ化されます。 5の。

行7と行8は、objectidとdisplayidが同じであり、行8のタイムスタンプがそのグループの最新のタイムスタンプ(行7)から5分以内であるためにグループ化されます。

データセットには、最新のタイムスタンプから5分以内にdisplayidとobjectidが一致する行がないため、行9は単独でグループ化されます。

* SQL Server2008R2を使用しています

4

1 に答える 1

0

ご覧いただきありがとうございます、そしてあなたの提案、この解決策は私にとってうまくいきました...

WITH 
    cte_remove AS (
SELECT b.*
FROM dbo.examplelog a
INNER JOIN dbo.examplelog b ON
    a.ID != b.ID AND
    a.DISPLAYID = b.DISPLAYID AND 
    a.OBJECTID = b.OBJECTID AND 
    b.[timestamp] BETWEEN a.[timestamp] AND DATEADD(SECOND, 300, a.[timestamp])
),
   cte_results AS (
SELECT * FROM dbo.examplelog EXCEPT 
SELECT * FROM cte_remove 
)
SELECT * FROM cte_results ORDER BY [timestamp]
GO
于 2012-04-17T23:06:30.183 に答える