2016-10-19 4 views
0

私はuserIDとタイムスタンプを返すクエリを持っています。私はトランザクションIDを割り当てるクエリに列を追加する必要があります。ユーザーIDに、複数のタイムスタンプが1秒未満である場合。私は同じIDを持つためにそれらすべてが必要です。SQLは、1秒未満でグループ化されたレコードにトランザクションIDを設定します。

UserID  timestamp    [new column] 
1   2016-07-17 18:20:17.373 1 
1   2016-07-17 18:21:04.780 2 
1   2016-07-19 09:52:36.443 3 
1   2016-07-19 09:52:36.460 3 
1   2016-07-19 09:53:22.473 4 
2   2016-07-19 09:52:36.490 5 
2   2016-07-19 09:52:36.553 5 
2   2016-07-19 09:53:11.290 6 
2   2016-07-19 09:53:11.323 6 
2   2016-07-19 09:54:11.211 6 
2   2016-07-19 09:55:11.123 6 
3   2015-05-12 09:45:56.990 7 
3   2015-05-12 09:45:57.007 7 
3   2015-05-12 09:45:59.699 8 
3   2015-05-12 09:45:60.202 8 

一部のユーザーには、他と重複するタイムスタンプがあります。 SQL Server 2008の使用

これを達成するための任意のヘルプは、高く評価されます。

+0

実際には、タイムスタンプを列名として使用しないでください。また、datetime型の情報とは関係のないSQL Serverのデータ型です。また、列名で常に避けるべきであることも全くあいまいです。 DateInsertedのようなものは、はるかに明確になります。 –

+0

私は新しい例(userid 3)をミックスに追加しました – Ammer

答えて

0
SELECT *, 
     DENSE_RANK() OVER(PARTITION BY userid,SUBSTR(timestamp,1,19) AS newtimestamp) AS new_column 
    FROM YourTable; 
0

あなたはこの

SELECT *, DENSE_RANK() OVER(order by datepart(HOUR,[timestamp]), datepart(MI,[timestamp]), datepart(s,[timestamp])) AS [New column] 
    FROM yourtable; 
+0

これはほぼ成功しました。このようなタイムスタンプが2つあるときはうまくいきません。 2015-05-12 09:45:56.990 2015-05-12 09:45:57.007 – Ammer

+0

なぜ機能しないのですか? –

+0

ms 990と007はわずか17ミリ秒ですが、別の分です。そのため、DENSE_RANKは私が望んでいないときに増分します。 上記の例を更新し、ユーザー3を追加して、このロジックが失敗することを示しました。 – Ammer

0

のようなクエリを試すことができますが、最後の2行分のトランザクションIDを確認することができます。 7と8でなければなりません。

create table #test(UserID int, [timestamp] datetime) 

    insert into #test values 
    (1,'2016-07-17 18:20:17.373'), 
    (1,'2016-07-17 18:21:04.780'), 
    (1,'2016-07-19 09:52:36.443'), 
    (1,'2016-07-19 09:52:36.460'), 
    (1,'2016-07-19 09:53:22.473'), 
    (2,'2016-07-19 09:52:36.490'), 
    (2,'2016-07-19 09:52:36.553'), 
    (2,'2016-07-19 09:53:11.290'), 
    (2,'2016-07-19 09:53:11.323'), 
    (2,'2016-07-19 09:54:11.211'), 
    (2,'2016-07-19 09:55:11.123') 


    select *, dense_rank() over(order by UserID, DATEADD(ms, -DATEPART(ms, [timestamp]), [timestamp])) as [new column] 
    from #test 
output: 
    UserID timestamp new column 
    1 2016-07-17 18:20:17.373 1 
    1 2016-07-17 18:21:04.780 2 
    1 2016-07-19 09:52:36.443 3 
    1 2016-07-19 09:52:36.460 3 
    1 2016-07-19 09:53:22.473 4 
    2 2016-07-19 09:52:36.490 5 
    2 2016-07-19 09:52:36.553 5 
    2 2016-07-19 09:53:11.290 6 
    2 2016-07-19 09:53:11.323 6 
    2 2016-07-19 09:54:11.210 7 
    2 2016-07-19 09:55:11.123 8 
+0

これはほぼうまくいきました。このようなタイムスタンプが2つある場合、動作しません。 2015-05-12 09:45:56.990 2015-05-12 09:45:57.007 – Ammer

関連する問題