質問: Microsoft SQL Server 2012を使っています。 例えば以下のようなレコードをもつテーブルがあるとします。 レコードは10分毎の1ヶ月分のデータになります。(4032Row) DateTime, Value1, Value2 2018-02-01 00:10:00 0.3 0.3 2018-02-01 00:20:00 0.3 0.6 2018-02-01 00:30:00 0.5 1.1 2018-02-01 00:40:00 0.2 1 2018-02-01 00:50:00 0.4 1.1 2018-02-01 01:00:00 0.1 0.7 ... 2018-02-28 24:00:00 0.1 0.7 ここで行いたいことは 「毎日のValue2の最大値とその時間を返す」ことです。 例えば、上の例だった場合 2/1のValue2の最大値が1.1であった場合、クエリの戻り値は 2018-02-01 00:30:00 0.5 1.1 であってほしいです。 Value2に1.1が複数ある場合は最初のレコードを最大値を記録した最初のレコードとして、DateTimeフィールド、Value1フィールドの値を受け取ります。 ここで試してみたクエリは以下の通りでした。 ``` SELECT FORMAT(DateTime, 'yyyyMMdd'), MAX(dblValue2) FROM TableA Group BY FORMAT(DateTime, 'yyyyMMdd') ``` これだと各日のMAX値は取れたのですが、そのMAX値を記録した日付が取得できませんでした。。 どなたか、解決するための良いクエリのご教授よろしくお願いします。 ※WHILEで以下にもCみたいにプログラマブルに書けば解決はできるのですが... せっかくなのでクエリで解決したいです。
回答: 試してないけど... ``` SELECT TableA.DateTime, TableA.dblValue1, TableA.dblValue2 FROM ( SELECT MIN(TableA.DateTime) AS D2 FROM ( SELECT FORMAT(DateTime, 'yyyyMMdd') AS D1, MAX(dblValue2) AS V1 FROM TableA GROUP BY FORMAT(DateTime, 'yyyyMMdd') ) AS Q1 INNER JOIN TableA ON FORMAT(TableA.DateTime, 'yyyyMMdd') = Q1.D1 AND TableA.dblValue2 = Q1.V1 GROUP BY FORMAT(TableA.DateTime, 'yyyyMMdd') ) AS Q2 INNER JOIN TableA ON TableA.DateTime = Q2.D2 ORDER BY TableA.DateTime ```