2010-11-22 3 views
1

サーバー:sql 2008 R2;データセット:50〜100万レコードの間SQL datetimeとの近接度

私はすべての車の平均速度(各車の番号ではない1つの番号)を決定する必要がある車両の速度インスタンスでいっぱいのテーブルを持っています。そのトリックは素晴らしい記録ですが、レコードが記録されている時点では一貫性がありませんので、私は8時15分にレコーディングし、8時20分までレコーディングすることができますその期間内に10秒ごとに実行されます。

特定の日時を指定すると、この平均速度を決定する必要があります。また、指定された時間とその車の記録とが直接一致しない可能性が高いため、記録から速度を選択する必要があります与えられた時間に最も近い。ここで

は、セットアップスクリプト

CREATE TABLE [dbo].[SpeedRecords](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [CarId] [int] NOT NULL, 
    [TimeOfEntry] [datetime] NOT NULL, 
    [Speed] [real] NOT NULL, 
CONSTRAINT [PK_SpeedRecords] PRIMARY KEY CLUSTERED ([Id] ASC)) 
go 
insert into SpeedRecords(CarId,TimeOfEntry,Speed) 
select 1, '11/22/2010 08:16:13', 67.56 union 
select 1, '11/22/2010 08:15:23', 63.87 union 
select 1, '11/22/2010 08:36:33', 45.66 union 
select 1, '11/22/2010 08:23:43', 56.87 union 
select 2, '11/22/2010 08:36:53', 78.66 union 
select 2, '11/22/2010 08:04:03', 34.88 union 
select 2, '11/22/2010 08:08:51', 23.23 union 
select 2, '11/22/2010 08:34:52', 65.87 union 
select 3, '11/22/2010 08:58:43', 45.34 union 
select 3, '11/22/2010 08:34:56', 73.23 union 
select 3, '11/22/2010 08:12:34', 12.87 union 
select 4, '11/22/2010 08:45:12', 66.45 union 
select 4, '11/22/2010 08:36:34', 90.87 union 
select 4, '11/22/2010 08:24:23', 34.89 union 
select 4, '11/22/2010 08:45:12', 45.83 


declare @dt datetime = '11/22/2010 08:43:14' 
-- select the average speed (for all cars) but 
-- only use the record for each car closest to 
-- the given datetime (@dt) 

答えて

1

使用ABS(DATEDIFF ...)制限、その上の最小の違い、ORDERをうまくすることです。

変更ROW_NUMBER() to DENSE_RANK()したい場合は、SQL Server 2000の

declare @dt datetime = '11/22/2010 08:43:14' 
-- select the average speed (for all cars) but 
-- only use the record for each car closest to 
-- the given datetime (@dt) 

;WITH Closest AS 
(
    SELECT 
     Speed, 
     ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ABS(DATEDIFF(second,@dt,TimeOfEntry))) AS Ranking 
    FROM 
     SpeedRecords 

) 
SELECT 
    AVG(Speed) 
FROM 
    Closest 
WHERE 
    Ranking = 1 

@dtあなたが相関サブクエリとTOPの必要があると思いますが、それは厄介なことだから同じ違いです2つの速度の平均