2015-07-10 250 views
-1

我有一個表,看起來像這樣的:SQL查詢 - 查找日常最小值,最大值和時間的最小值和最大值發生

_Datetime   | Value 
2015-05-01 06:00:00 | 12.3 
2015-05-01 06:20:00 | 12.5 
2015-05-01 06:40:00 | 12.3 
2015-05-01 07:00:00 | 13.5 
2015-05-01 07:20:00 | 14.5 
2015-05-01 07:40:00 | 14.3 
2015-05-01 08:00:00 | 18.2 
2015-05-01 08:20:00 | 15.0 
2015-05-01 08:40:00 | 15.0 

2015-05-02 06:00:00 | 19.2 
2015-05-02 06:20:00 | 7.3 
2015-05-02 06:40:00 | 11.4 
2015-05-02 07:00:00 | 9.5 
2015-05-02 07:20:00 | 7.6 
2015-05-02 07:40:00 | 6.6 
2015-05-02 08:00:00 | 10.4 
2015-05-02 08:20:00 | 19.3 
2015-05-02 08:40:00 | 15.4 

2015-05-03 06:00:00 | 8.7 
2015-05-03 06:20:00 | 8.6 
2015-05-03 06:40:00 | 8.6 
2015-05-03 07:00:00 | 21.5 
2015-05-03 07:20:00 | 12.4 
2015-05-03 07:40:00 | 7.3 
2015-05-03 08:00:00 | 10.8 
2015-05-03 08:20:00 | 12.5 
2015-05-03 08:40:00 | 10.6 

我想:

-select分鐘,最大和平均每天

- 選擇時間,其中最大和最小值發生(我只想選擇一個行 - 第一次發生)

_Date  | _Min | _MinTime | _Max | _MaxTime | Avg | 
2015-05-01 | 12.3 | 06:00:00 | 18.2 | 08:00:00 | 14.18 | 
2015-05-02 | 6.6 | 07:40:00 | 19.3 | 08:20:00 | 11.86 | 
2015-05-03 | 7.3 | 07:40:00 | 21.5 | 07:00:00 | 11.22 | 

我可以很容易地得到最小值,最大值和平均值,但我陷入了困境。

+5

您正在使用哪個數據庫? Mysql或sqlserver? – FutbolFan

+1

請顯示您到目前爲止的查詢。 – sstan

+0

我正在使用SQL Server 2008 R2。 –

回答

1

試試這個 - 應返回只有一組每天的值。 (編輯 - 增加平均值,按評論中的建議四捨五入)。

; with cte as (
select * 
    , cast (_datetime as date) as [DateFormat] 
    , cast (_datetime as time) as [TimeFormat] 
    , row_number() over (partition by cast (_datetime as date) order by Value, _datetime) RNmin 
    , row_number() over (partition by cast (_datetime as date) order by Value desc, _datetime) RNmax 
    , Avg(value) over (partition by cast (_datetime as date)) as AvgVal 
from MyTable 
) 
select a.DateFormat, a.value as MinValue, a.TimeFormat as MinTime 
    , b.value as MaxValue, b.TimeFormat as MaxTime 
    , cast(a.AvgVal as decimal(5,2)) as AverageValue 
from Cte a 
join cte b 
on a.DateFormat = B.Dateformat and a.RNmin = 1 and b.RNmax = 1 
+0

這會爲所有日期返回相同的_MinTime和_MaxTime。看看上面的輸出,這不是OP正在尋找的東西。 – FutbolFan

+0

是的 - 當我最初發布時,這是一個錯誤。它現在應該工作了,@nepalirookie。我在錯誤的專欄中排序;對於那個很抱歉。 – APH

+1

這應該現在工作。只是一個建議,OP正在尋找兩位小數的平均值。所以,我只會將這個平均字段作爲十進制(5,2)。 http://www.sqlfiddle.com/#!3/8baed/13/0 – FutbolFan

-1

-

this will get you the mins..... 
create table table1 
(_date datetime, 
value float); 

insert into table1 values (
'2015-05-01 06:00:00', 12.3) 
,('2015-05-01 06:20:00',12.5) 
<('2015-05-02 06:00:00', 19.2) 
,('2015-05-02 06:20:00', 7.3) 

select * from 
(select min(value) as min1 ,cast(_date as date) as date1 from table1 group by cast(_date as date)) 
as i1 
inner join 
(select cast(_date as date) _date1,value, cast(_date as time) _time1 from table1) as i2 

on i1.min1= i2.value and 
cast(i2._date1 as date)= i1.date1 
+0

如果沒有解釋,有人扣除了一點,我感到印象深刻。 –

+0

點擊按鈕比敲打要容易得多,所以不要太驚訝。 – Strawberry

0
SELECT x.* 
    , min.datetime min_time 
    , max.datetime max_time 
    FROM 
    (SELECT DATE(datetime) date 
      , MIN(value) min_value 
      , MAX(value) max_value 
      , AVG(value) 
     FROM my_table 
     GROUP 
      BY DATE(datetime) 
    ) x 
    JOIN my_table min 
    ON DATE(min.datetime) = x.date 
    AND min.value = x.min_value 
    JOIN my_table max 
    ON DATE(max.datetime) = x.date 
    AND max.value = x.max_value; 
+0

此查詢不需要我做什麼,但仍然列出了2015-05-01 –

+0

的多個最小值,它爲2015-05-01返回多個列,因爲您在兩個不同時間有兩個最小值「12.3」。 '2015-05-01 06:00:00 | 12.3'和'2015-05-01 06:40:00 | 12.3'。 – FutbolFan

+0

正確。最小值在2015.03.01發生了兩次,但我希望查詢返回第一個。 –