2017-02-16 6 views
0

私は時間単位のレコードを持つテーブルを持っていますが、午後1時、午後2時など正確には24時間ではありません。代わりに2:18 、2:38、3:10、3:45など。最も近い時刻の値を正確な時刻に変換する

私の最終的なデータセットでは、24時間のデータポイントと正確な時間が必要です。そこでは、正確な時間として次の時間に最も近いデータポイントを持ち、その他を削除する予定です。添付の画像を参照してください。

元のデータセット:

enter image description here

私は、最終的なデータ・セットが

決勝のようになりたいのに対し、期待:

enter image description here

をだから、基本的に私は、複数のデータを持っているかもしれません1時間の範囲のポイントと私は次の正確な時間で最も近いものを設定し、削除する必要がありますその他。

私はどのようなアプローチを取り入れるべきですか?これを達成する方法は?

+0

時刻列のデータ型と、使用しているSQL Serverのバージョンは何ですか? –

+0

@ZoharPeledデータ型はtime(7)で、SQL Server 2014 Management Studio(12。0) – user7409370

答えて

0

は多分これをアーカイブするための別のアプローチがありますが、鉱山は、以下の通りである: -

  • 使用dateadd機能次の時間に到達するための余分な分を追加します。

  • Min 機能を使用して目的の出力のみを選択する場合は、Where句を使用します。

デモ: -

DDL & DML

Create table Test (
        [Date] date , 
        [time] time(7), 
        col1 char (1), 
        col2 char (1) , 
        col3 char(1) 
       ) 
go 
insert into Test values ('02/02/2017' , '1:15' , 'a' , 'b' , 'c') 
insert into Test values ('02/02/2017' , '1:35' , 'w' , 'e' , 'r') 
insert into Test values ('02/02/2017' , '2:16' , 'q' , 'w' , 'e') 
insert into Test values ('02/02/2017' , '3:48' , 'z' , 'x' , 'c') 
insert into Test values ('02/02/2017' , '3:58' , 'b' , 'n' , 'm') 
go 
select * from Test 

結果: -

enter image description here

クエリ

select [Date] , 
     dateadd(minute,abs(datepart(minute,[time]) - 60),[time]) as [time], 
     col1 , col2 , col3 
from test 
where 
    datepart(hour,[time]) 
in 
(
    select 
    datepart(hour,[time]) 
    from Test 
    group by datepart(hour,[time]) 

) 
AND 
    abs(datepart(minute,[time]) - 60) 
in 
(
    select 
    min(abs(datepart(minute,[time]) - 60)) 
    from Test 
    group by datepart(hour,[time]) 
) 

結果: - :

;WITH CTE AS 
(
    SELECT [Date], 
      DATEADD(MINUTE, 60 - DATEPART(MINUTE, [time]), [time]) [Time], 
      col1, 
      col2, 
      col3, 
      ROW_NUMBER() OVER(PARTITION BY DATEPART(HOUR, [time]) ORDER BY Date, Time DESC) rn 
    FROM Test 
) 

SELECT CASE WHEN [Time] = '00:00:00' THEN DATEADD(DAY, 1, [Date]) ELSE [Date] END [Date], 
     [Time], 
     col1, 
     col2, 
     col3 
FROM CTE 
WHERE rn = 1 

結果

enter image description here

+0

これはありがとうございました。それは本当に役に立つと思うし、私のシナリオで同じを活用しようとする。ここで言及したのは、この作品は、23時間目の推定が最終的に翌日になるという事実を考慮に入れます。したがって、日付はそれに応じて更新する必要があります。たとえば、23:48の02/02/2017のデータポイントは、00:00 03/02/2017と推定する必要があります。したがって、日付を更新する必要があります。 – user7409370

0

1つのオプションは、次のラウンドの時間を取得するためにCTEROW_NUMBERを使用して、DATEADDすることです。

Date   Time  col1 col2 col3 
02.02.2017  02:00:00 w  e  r 
02.02.2017  03:00:00 q  w  e 
02.02.2017  04:00:00 b  n  m 
+0

ありがとうZOhar。それは本当に役に立つと思うし、私のシナリオで同じを活用しようとする。ここで言及したのは、この作品は、23時間目の推定が最終的に翌日になるという事実を考慮に入れます。したがって、日付はそれに応じて更新する必要があります。たとえば、23:48の02/02/2017のデータポイントは、00:00 03/02/2017と推定する必要があります。したがって、日付を更新する必要があります – user7409370

+0

ケースを追加するだけです。私はそれを含めるために私の答えを編集しました。 –

関連する問題