2016-12-17 5 views
0

私は、下記の表からのデータを分析するには、いくつかの要件がありグループとすべてのレコードを取得

SELECT MId,SId,PId,DataHour, 
CAST(t.[SDate] as DATE), MAX(t.Powers) as PeakPower 
FROM [HourData] t where CONVERT(date,[SDate]) between 
CONVERT(date,'2016-12-01 09:45:59.240') and CONVERT(date,'2016-12-08 09:45:59.240') 
GROUP BY MId,SId,PId, CAST(t.[SDate] AS DATE),DataHour 
order by CAST(t.[SDate] AS DATE),DataHour,PeakPower 

彼の日に、各時間のすべてのMID、SID、PIDに合計を取得するクエリ上記。 しかし、私は他のいくつかの要件、私は毎日、すなわちデータリンクから1時間に最も多く使用されているPIdが必要ですhttp://ideone.com/IW4FUA 私は以下のように1時間ごとに最も使用されたPIdのデータが必要です。

Power  PId 
5163.316 6 
5135.371 6 

PId 6は、1日の時間0と時間1の値が最も高くなります。 各データ時間内のすべてのPIDの合計で、毎日の最大時間を取得します。

このクエリは、各時間のデータの詳細を与える

SELECT MId,SId,PId,DataHour, 
CAST(t.[SDate] as DATE), MAX(t.Powers) as PeakPower 
FROM [MonataHourData] t where CONVERT(date,[SDate]) between 
    CONVERT(date,'2016-12-01 09:45:59.240') and CONVERT(date,'2016-12-08 09:45:59.240') 
GROUP BY MId,SId,PId, CAST(t.[SDate] AS DATE),DataHour 
order by CAST(t.[SDate] AS DATE),DataHour,PeakPower 

CREATE TABLE [dbo].[HourData](
    [ID] [bigint] NOT NULL, 
    [SId] [bigint] NOT NULL, 
    [PID] [bigint] NOT NULL, 
    [Powers] [decimal](18, 4) NOT NULL, 
    [DataHour] [int] NOT NULL, 
    [StartDate] [datetime] NOT NULL) 
+0

SDATE列がどのようなデータタイプですか? – Tomalak

+0

StartDateはSDate、その日時です。 –

答えて

0

これを行うには多くの方法がありますが、ここではそれらのいくつかである:

rextesterリンクはあなたのデータにそれらすべてをテストするには:http://rextester.com/KBO56228

--declare @from datetime = '2016-12-01 09:45:59.240'; 
--declare @thru datetime = '2016-12-08 09:45:59.240'; 
/* the above can be simplified to: */ 
declare @from date = convert(date,'2016-12-01 09:45:59.240', 121); 
declare @thru date = convert(date,'2016-12-08 09:45:59.240', 121); 

クロスapplyバージョン:

select distinct 
     x.Mid 
    , x.Sid 
    , x.Pid 
    , t.DataHour 
    , Date = convert(date, t.SDate) 
    , x.Powers 
    from HourData t 
    cross apply (
     select top 1 
      Mid 
     , Sid 
     , Pid 
     , Powers 
     from HourData c 
     where convert(date, c.sdate) = convert(date, t.sdate) 
      and c.DataHour = t.DataHour 
     order by c.Powers desc 
     ) as x; 

top with tiesバージョン:

with PowerRN as (
select 
     t.Mid 
    , t.Sid 
    , t.Pid 
    , t.DataHour 
    , Date = convert(date, t.SDate) 
    , t.Powers 
    , rn = row_number() over (partition by convert(date, t.SDate),t.DataHour order by t.Powers desc) 
    from HourData t 
    where convert(date, sdate) >= @from 
    and convert(date, sdate) < @thru 
) 
select Mid, Sid, Pid, DataHour, Date, Powers 
    from PowerRN 
    where rn=1 
    order by Date, DataHour; 

max()over()バージョン:row_number()バージョンと

select top 1 with ties 
     t.Mid 
    , t.Sid 
    , t.Pid 
    , t.DataHour 
    , Date = convert(date, t.SDate) 
    , t.Powers 
    from HourData t 
    where convert(date, sdate) >= @from 
    and convert(date, sdate) < @thru 
    order by row_number() over (partition by convert(date, t.SDate),t.DataHour order by t.Powers desc); 

common table expression

with PeakPower as (
    select 
     t.Mid 
     , t.Sid 
     , t.Pid 
     , t.DataHour 
     , Date = convert(date, t.SDate) 
     , t.Powers 
     , PeakHourPower = max(t.Powers) over (partition by convert(date, t.SDate),t.DataHour) 
    from HourData t 
    where convert(date, sdate) >= @from 
     and convert(date, sdate) < @thru 
    group by 
     t.Mid 
     , t.Sid 
     , t.Pid 
     , convert(date, t.SDate) 
     , t.DataHour 
     , t.Powers 
) 
select Mid, Sid, Pid, DataHour, Date, Powers 
    from PeakPower 
    where Powers = PeakHourPower 
    order by Date, DataHour; 

inner joinバージョン:

select 
     t.Mid 
    , t.Sid 
    , t.Pid 
    , t.DataHour 
    , Date = convert(date, t.SDate) 
    , t.Powers 
    from HourData t 
    inner join (
     select 
      DataHour 
     , Date = convert(date, t.SDate) 
     , PeakHourPower = max(t.Powers) 
     from HourData t 
     where convert(date, sdate) >= @from 
      and convert(date, sdate) < @thru 
     group by 
      convert(date, SDate) 
      , DataHour 
     ) as x on x.Date   = convert(date, sdate) 
      and x.DataHour  = t.DataHour 
      and x.PeakHourPower = t.Powers 

    where convert(date, sdate) >= @from 
    and convert(date, sdate) < @thru; 
    order by t.Date, t.DataHour; 
関連する問題