2016-12-17 1 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 시드, PID의 합계를 얻을 것이다 쿼리 위 . 그러나 몇 가지 다른 요구 사항, 나는 매일 PId가 데이터 링크에서 하루에 한 시간 동안 가장 많이 사용하는 것을 필요로합니다. http://ideone.com/IW4FUA 나는 아래와 같이 매 시간마다 가장 많이 사용되는 PId의 데이터가 필요합니다.

Power  PId 
5163.316 6 
5135.371 6 

PId 6은 하루 중 시간 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, Datetime입니다. –

답변

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 버전 :

,363,210
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; 
관련 문제