2016-04-13 14 views
0

私はtempというテーブルを持っています。この表には、日付と値があります。SQLは12時間以内にMAXデータを選択します

Date    | Value 
2016/04/01 07:00am | 1 
2016/04/01 09:00am | 2 
2016/04/01 11:00am | 3 
... 
2016/04/01 07:00pm | 5 
2016/04/01 11:00pm | 2 
... 
2016/04/02 07:00am | 10 
2016/04/02 09:00am | 13 
2016/04/02 11:00am | 1 
... 
2016/04/02 07:00pm | 32 
2016/04/02 09:00pm | 40 

私は返すしたいと思います:

​​

アイデアは、12時間間隔でグループにあり、その後、前記グループの最大値を見つけます。

SELECT t.date, max(t.value) 
FROM temp t 
WHERE t.Date between DATEADD(hour, 7, '04/01/2016') and DATEADD(minute, 1859, '04/02/2016') 
GROUP BY DATEPART(Hour, t.date)%12, t.date 
ORDER BY Date 

をしかし、それはすべてのデータなし12時間のグループを返します。

これまでのところ、私は持っています。

アイデア?

+1

あなたが毎日同じ12時間のグループです - 真夜中を正午と12:01 - 11:59 pm? – n8wrl

+0

はい、毎日同じです。 – TeeJ

+0

あなたの日付に実際に午前/午後がある場合は、日付の最後の2文字でさらにグループ化することができます。 – Ezenhis

答えて

0

MAXは日付でグループ化したくないので、最も大きな値を持つdatetimeの単一インスタンスが必要です。したがって、あなたはその期間(ORDER BY t.value DESC)内の最大値を持つ行を取得するには、日付とAM/PM期間に基づいてPARTITIONROW_NUMBERを使用することができます。

SELECT date, value 
FROM 
(SELECT t.date, 
    t.value, 
    ROW_NUMBER() 
     OVER(PARTITION BY CAST(t.date AS date), CASE WHEN DATEPART(hour, t.date) < 12 THEN 0 ELSE 1 END 
     ORDER BY t.value DESC) AS rownum 
    FROM temp t 
    WHERE t.Date between DATEADD(hour, 7, '04/01/2016') and DATEADD(minute, 1859, '04/02/2016') 
) max_val 
WHERE max_val.rownum = 1 
ORDER BY Date 
+0

これは、すべてのデータを再度返します。グループはありません。 – TeeJ

+0

残念ですが、 'PARTITION'(' 'SQLの最新バージョンを前提としていますか?' '日付' 'にCASTするのを忘れましたか?)... – strickt01

+0

あなたは私の英雄です。ありがとうございました!!! – TeeJ

関連する問題