0

特定の時間内の最初と最後の価格を見つける必要があります。現在、私のクエリには、WHERE私が見ている時間を決定する句があります。

特定の日付の 1 時間ごとの結果を表示できるようにする方法はありますか?

SELECT TOP 1 Price FROM MyData WHERE [Product] = 'XXXXXX' AND CAST([Deal] AS Date) = '2013-09-04' AND DATEPART(HOUR, [Deal]) = 9 Order By (datediff(minute, '1990-1-1', [Deal Time]) /60)

Dealフィールドの型DateTime

AND DATEPART(HOUR, [Deal]) = 9これは、価格がその時間の最初の価格であるすべてのエントリを表示できるようにするものに置き換えたいビットです。

編集N分<1時間も実行できるようにしたいですか? 30分ごとの最終価格のように...など..

4

1 に答える 1

1

(最大ではなく) 各時間の最終価格を見つけようとしています。あなたはこれを行うことができます。変換を確認できるように、クエリから始めましょう (これは、簡単に読めるように書式設定されています)。

SELECT TOP 1 Price
FROM MyData
WHERE [Product] = 'XXXXXX' AND
      CAST([Deal] AS Date) = '2013-09-04' AND
      DATEPART(HOUR, [Deal]) = 9
Order By (datediff(minute, '1990-1-1', [Deal Time]) /60)

アイデアは、各時間内に各レコードに連続番号を割り当てることです。この番号は、最新のタイムスタンプから始まり、下降します。次に、最新の価格は、連続した値が 1 の価格です。これは、ウィンドウ関数を使用しますrow_number()

結果のクエリは、明示的な集計を使用しません。

select DATEPART(HOUR, [Deal]), price
from (select md.*,
            row_number() over (partition by DATEPART(HOUR, [Deal])
                               order by [Deal] desc) as seqnum
      from MyData md
      where [Product] = 'XXXXXX' AND
            CAST([Deal] AS Date) = '2013-09-04'
     ) md
where seqnum = 1;

where句から日付条件を削除し、 partition by.

于 2013-11-07T15:07:35.367 に答える