2

日付、時刻、価格の3つの列で構成されるテーブルがあります。「時間」列はほぼ分間隔ですが、すべての分間隔が表示されるわけではありません。Date、FlooredTime、LastPriceInIntervalで構成される新しいテーブルを作成したいと思います。ここで、FlooredTime =各10分間隔の開始時の時間であり、LastPriceInIntervalは各間隔内の利用可能な最大時間での価格です。

Old Table:                          New Table:

Date    Time            Price       Date        FlooredTime LastPriceInInterval
2012-05-10  02:50:00    1352.7      2012-05-10  02:40:00    1353.0
2012-05-10  02:46:00    1353.0      2012-05-10  02:30:00    1353.5
2012-05-10  02:45:00    1352.8              
2012-05-10  02:44:00    1353.2              
2012-05-10  02:43:00    1353.1              
2012-05-10  02:42:00    1353.2              
2012-05-10  02:40:00    1353.4              
2012-05-10  02:39:00    1353.5              
2012-05-10  02:38:00    1354.6              
2012-05-11  03:31:00    1355.0              
2012-05-11  03:29:00    1354.0              

これは私が今まで持っていたものですが、今は行き詰まっています。内部のselectステートメントはwhere句でのMaxの使用を好まないようです。Max(datepart(minute、m1.Time)%10)。許可された構文を使用して目的の結果を達成する方法を知っていただければ幸いです。

SELECT TOP 1000 Date
   ,DATEADD(minute,-DATEPART(minute,Time)%10 ,Time) as FlooredTime
   ,(Select Price from dbo.MyData
         where m3.Date = m1.Date
         and DATEPART(hour, m3.Time) = DATEPART(hour, m1.Time)
         and datepart(minute,m3.Time)/10 = Floor(datepart(minute,m1.Time)/10)
         and datepart(minute,m3.Time)%10 = Max(datepart(minute,m1.Time)%10)
         ) as LastPriceInInterval
FROM dbo.MyData
where DATEPART(minute,Time)%10 = 0
order by Date Desc, Time Desc

ありがとう!

後期編集-後で結果をMerge式のソーステーブルとして使用します。

4

2 に答える 2

2

最初に間隔を特定し、各間隔の最大時間を取得してから、テーブルに参加して価格を取得できますか?を使用すると、CTEこれを簡単に実現できます。

;WITH intervals(Date, T1, MaxTime) AS (
SELECT
    Date
    , DATEADD(minute, -DATEPART(minute, Time)%10, Time)
    , MAX(Time) AS MaxTime
FROM dbo.MyData
GROUP BY Date
    , DATEADD(minute, -DATEPART(minute, Time)%10, Time)
)
SELECT t.Date AS Date, i.T1 AS Time, t.Price
FROM dbo.MyData t
INNER JOIN intervals i ON t.Date = i.Date AND t.Time = i.MaxTime
ORDER BY Date DESC, Time DESC
于 2012-07-03T04:58:58.840 に答える
1

Timeそれぞれの 10 分間隔内で逆の順序で行をランク付けしてから、上位にランク付けされた行を選択できます。

WITH ranked AS (
  SELECT
    *,
    FlooredTime = DATEADD(MINUTE, -DATEDIFF(MINUTE, 0, Time) % 10, Time),
    TimeRank    = ROW_NUMBER() OVER (
      PARTITION BY DATEDIFF(MINUTE, 0, Time) / 10
      ORDER BY Time DESC
    )
  FROM MyData
)
SELECT
  Date,
  FlooredTime,
  LastPriceInInterval = Price
FROM ranked
WHERE TimeRank = 1
ORDER BY
  Date DESC,
  FlooredTime DESC
;

これは、クエリの SQL Fiddle デモです。

于 2012-07-03T06:37:57.200 に答える