2016-12-17 124 views
0

我想用的每一天最大功率值的记录,请参阅下表获取与最大值记录每个

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

    CONSTRAINT [PK_HourData] 
     PRIMARY KEY CLUSTERED ([ID] ASC, [HourShow] ASC, [StartDate] ASC) 
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) 

下面的查询将获得最大的权力使用的每一天,但如何我是否可以获得记录本身,假设如果我需要DataHour,我怎么能得到它,我不能将它包含在GroupBy子句中。

SELECT 
    CAST(t.[StartDate] as DATE), 
    MAX(t.Powers) as 'Peak Power Each Day' 
FROM 
    [HourData] t 
WHERE 
    CONVERT(date, [StartDate]) BETWEEN CONVERT(date, '2016-12-01 09:45:59.240') 
            AND CONVERT(date,'2016-12-08 09:45:59.240') 
GROUP BY 
    CAST(t.[StartDate] AS DATE) 
ORDER BY 
    CAST(t.[StartDate] AS DATE) 
+0

如果后期样本输入和输出也会很好? – Buddi

回答

0

您可以使用窗口函数获取整个记录。如果你想要一个(任意)

SELECT hd.* 
FROM (SELECT hd.*, 
      MAX(hd.Powers) OVER (PARTITION BY CAST(hd.StartDate as Date)) as maxpowers 
     FROM HourData hd 
    ) hd 
WHERE CONVERT(date, StartDate) between '2016-12-01' and '2016-12-08' AND 
     powers = maxpowers; 

SELECT hd.* 
FROM (SELECT hd.*, 
      ROW_NUMBER() OVER (PARTITION BY CAST(hd.StartDate as Date) ORDER BY hd.powers DESC) as seqnum 
     FROM HourData hd 
    ) hd 
WHERE CONVERT(date, StartDate) between '2016-12-01' and '2016-12-08' AND 
     seqnum = 1; 

注意,我从between比较移除的时间组件的以下获得在每一天所有的最大值。无论如何,到目前为止的转换都会删除时间分量。这很简单。

+0

谢谢,我如何添加组字段PId以及像GROUP BY CAST(t。[StartDate] AS DATE),PortID –

+0

@ManiothShijith的日期。 。 。我完全不理解你的评论。您的示例数据甚至没有“pid”。 –

0

返回的结果是查询的SELECT部分。 SELECT *返回整个条目。