2016-12-17 14 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; 

使用すると、1つ(任意)したい場合:私はbetween比較から時間コンポーネントを削除

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; 

注意を。日付への変換は、とにかく時間コンポーネントを削除します。これは簡単です。

+0

ありがとう、どのようにGROUP BY CAST(t。[StartDate] AS DATE)、PortID –

+0

@ ManiothShijithのような日付とともにグループPIdフィールドを追加できますか? 。 。私はあなたのコメントを全く理解していません。あなたのサンプルデータは 'pid'を持っていません。 –

0

返される内容は、クエリの一部であるSELECTです。 SELECT *はエントリ全体を返します。

関連する問題