サイズをお試しください。指定された間隔で複数のタイムスタンプがある場合は、インスタンスの戻り値を処理することさえできます。 注:Bigint PK列の名前はidxです。あなたが "idx"がどこにないのか分かりません。
;WITH Interval_Helper([minute],minute_group)
AS
(
SELECT 0, 1 UNION SELECT 1, 1 UNION SELECT 2, 1 UNION SELECT 3, 1 UNION SELECT 4, 1
UNION SELECT 5, 1 UNION SELECT 6, 1 UNION SELECT 7, 1 UNION SELECT 8, 1 UNION SELECT 9, 1
UNION SELECT 10, 1 UNION SELECT 11, 1 UNION SELECT 12, 1 UNION SELECT 13, 1 UNION SELECT 14, 1
UNION SELECT 15, 2 UNION SELECT 16, 2 UNION SELECT 17, 2 UNION SELECT 18, 2 UNION SELECT 19, 2
UNION SELECT 20, 2 UNION SELECT 21, 2 UNION SELECT 22, 2 UNION SELECT 23, 2 UNION SELECT 24, 2
UNION SELECT 25, 2 UNION SELECT 26, 2 UNION SELECT 27, 2 UNION SELECT 28, 2 UNION SELECT 29, 2
UNION SELECT 30, 3 UNION SELECT 31, 3 UNION SELECT 32, 3 UNION SELECT 33, 3 UNION SELECT 34, 3
UNION SELECT 35, 3 UNION SELECT 36, 3 UNION SELECT 37, 3 UNION SELECT 38, 3 UNION SELECT 39, 3
UNION SELECT 40, 3 UNION SELECT 41, 3 UNION SELECT 42, 3 UNION SELECT 43, 3 UNION SELECT 44, 3
UNION SELECT 45, 4 UNION SELECT 46, 4 UNION SELECT 47, 4 UNION SELECT 48, 4 UNION SELECT 49, 4
UNION SELECT 50, 4 UNION SELECT 51, 4 UNION SELECT 52, 4 UNION SELECT 53, 4 UNION SELECT 54, 4
UNION SELECT 55, 4 UNION SELECT 56, 4 UNION SELECT 57, 4 UNION SELECT 58, 4 UNION SELECT 59, 4
)
,Time_Interval([timestamp], value, [date], [hour], minute_group)
AS
(
SELECT A.[Timestamp]
,A.value
,CONVERT(smalldatetime, CONVERT(char(10), A.[Timestamp], 101))
,DATEPART(HOUR, A.[Timestamp])
,B.minute_group
FROM myTable A
JOIN Interval_Helper B
ON (DATEPART(minute, A.[Timestamp])) = B.[minute]
AND A.[Timestamp] >= '12/01/2012'
AND A.[Timestamp] <= '01/10/2013'
AND A.ConfigID = 435
)
,Time_Interval_TimeGroup([date], [hour], [minute], MaxTimestamp)
AS
(
SELECT [date]
,[hour]
,minute_group
,MAX([Timestamp]) as MaxTimestamp
FROM Time_Interval
GROUP BY [date]
,[hour]
,minute_group
)
,Time_Interval_TimeGroup_Latest(MaxTimestamp, MaxIdx)
AS
(
SELECT MaxTimestamp
,MAX(idx) as MaxIdx
FROM myTable A
JOIN Time_Interval_TimeGroup B
ON A.[Timestamp] = B.MaxTimestamp
GROUP BY MaxTimestamp
)
SELECT A.*
FROM myTable A
JOIN Time_Interval_TimeGroup_Latest B
ON A.idx = B.MaxIdx
ORDER BY A.[timestamp]
これは、別のは、以下の@MntManChrisから巧妙な時間グループ機能を取るです:上記の私のコメントは、私はロブの答えを使用しますが排除するためにユーザ関数をimplmentedまし言うよう
CREATE FUNCTION dbo.fGetTimeGroup (@DatePart tinyint, @Date datetime)
RETURNS int
AS
BEGIN
RETURN CASE @DatePart
WHEN 1 THEN DATEPART(mi, @Date)
WHEN 2 THEN DATEPART(mi, @Date)/5 + 1 -- 5 min
WHEN 3 THEN DATEPART(mi, @Date)/15 + 1 -- 15 min
WHEN 4 THEN DATEPART(mi, @Date)/30 + 1 -- 30 min
WHEN 5 THEN DATEPART(hh, @Date) -- hr
WHEN 6 THEN DATEPART(hh, @Date)/6 + 1 -- 6 hours
WHEN 7 THEN DATEPART(hh, @Date)/12 + 1 -- 12 hours
WHEN 8 THEN DATEPART(d, @Date) -- day
ELSE -1
END
END
これは私が探していた答えのようです。インターバルが15分から5分、または1分、さらには6時間に変更された場合、それをどのように実装するのが最適かはわかりませんが。私はもう少しそれを勉強しなければならないでしょう。 – MtnManChris
間隔を可変にする必要がある場合は、Interval_Helperをその日の1分ごとに動的にロードし(1440レコード)、必要な間隔のグループ化に基づいてminute_group割り当てを動的に調整します。また、分の列のDATEPART結合を調整して、HOURコンポーネントにタイムスタンプのMINUTEコンポーネントを加えた60を掛けることも含める必要があります。 –
Rob、私がやったことは、基本的にInterval_Helperへの結合を取り除いたユーザー関数を作成することでした。このように、 "、B.minute_groupは" time_group "としてdbo.fGetTimeGroup(@tInterval、A. [Timestamp])"になりました。 – MtnManChris