

一度、こちらで回答いただいた内容なのですが追加で質問させていただきます。  
[mysql 勤務データ
日付またぎのID抽出](https://ja.stackoverflow.com/questions/37076/mysql-%E5%8B%A4%E5%8B%99%E3%83%87%E3%83%BC%E3%82%BF-%E6%97%A5%E4%BB%98%E3%81%BE%E3%81%9F%E3%81%8E%E3%81%AEid%E6%8A%BD%E5%87%BA)

以下のように15分ごとにIDが表示されるようになりました。  
[![画像の説明をここに入力](https://i.stack.imgur.com/9iV0Y.png)](https://i.stack.imgur.com/9iV0Y.png)

①この15分ごとに表示されたIDを以下のようにUSER_NAMEごとにまとめたい。  
[![画像の説明をここに入力](https://i.stack.imgur.com/6z3G9.png)](https://i.stack.imgur.com/6z3G9.png)

②USER_NAMEごとにまとめた後にSTART_TIME順に並び替えたい。

①についてはエクセルのPIVOTなどで値を最大値にすれば表示させることもできますが、SQL上で最大のIDを表示させたい。  
②についてはMIN(START_TIME)と入れてもうまくでてきません。（1行のみのデータが表示されてしまう）  
①②をSQL上で表示させることは可能なのでしょうか。。

[code]

    元データ
    SELECT distinct
            県コード,
            市コード,
           USER_NAME,
           ID,
           case when (DATE_FORMAT(CONVERT_TZ(END_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') > '00:00' and (DATE_FORMAT(CONVERT_TZ(START_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') <'00:15')) then SCHEDULE_INTERVAL_TYPE_ID end as '00:00',
                case when (DATE_FORMAT(CONVERT_TZ(END_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') > '00:15' and (DATE_FORMAT(CONVERT_TZ(START_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') <'00:30')) then SCHEDULE_INTERVAL_TYPE_ID end as '00:15',
    case when (
        (DATE_FORMAT(CONVERT_TZ(END_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') > '00:00'
         OR
         DATE_FORMAT(CONVERT_TZ(END_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') = '00:00'
         )
         and
         DATE_FORMAT(CONVERT_TZ(START_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') <'00:15')
         ) then SCHEDULE_INTERVAL_TYPE_ID end as '00:00',
    /* 途中省略 */
    case when (
        (DATE_FORMAT(CONVERT_TZ(END_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') > '23:45'
         OR
         DATE_FORMAT(CONVERT_TZ(END_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') = '00:00'
        )
        and
        DATE_FORMAT(CONVERT_TZ(START_TIME, '+00:00','Asia/Tokyo') ,'%H:%i') < '23:59')
        ) then SCHEDULE_INTERVAL_TYPE_ID end as '23:45'
    FROM テーブル1
    WHERE 
        DATE_FORMAT(CONVERT_TZ(START_TIME, '+00:00','Asia/Tokyo') ,'%Y%m%d') = DATE_FORMAT(CONVERT_TZ(CURRENT_TIMESTAMP, '+00:00','Asia/Tokyo') ,'%Y%m%d');
    
[/code]


CC BY-SA 3.0
2017-08-19T08:27:37.960
37336
2022-02-26T00:01:35.183
2017-08-19T11:50:11.720
76
24822
question
mysql sql
mysql 最大値の抽出と並び替え


＃性能は度外視します。

①は、質問にあるselect文の結果を一時表にして、各カラム(「00:00」から「23:45」まで)について、最大値を取得すればよいかと思います。

[code]

        /* イメージ */
        select user_name,max("00:00"),max("00:15"),/* 途中略 */,max("23:45")
        from ( 質問のselect文全体 ) t
        group by t.user_name;
    
[/code]

②は、質問の意図がわからないので回答は控えます。(質問にあるselect文では`START_TIME`は取得していないので、並び替える、の意図が不明でした)


CC BY-SA 3.0
2017-08-19T15:56:09.850
37343
2017-08-19T15:56:09.850
20098
37336
answer


＃コメントの内容は異なる質問と見受けましたので、別回答として書きます。

前述のコメントで質問されているのは、時間帯(15分別)に最大値であるIDの件数を取得する(ユーザ別の結果をまとめる)、ということと想定しました。こういうSQL文でしょうか?

[code]

        /* イメージ */
        (
        WITH tbl as (先の回答のSELECT文全体)
        select '00:00' as "time", "t00:00" as "id", count("t00:00") from tbl where "t00:00" is not null group by "id"
        union
        select '00:15' as "time", "t00:15" as "id", count("t00:15") from tbl where "t00:15" is not null group by "id"
        union
        /* 途中省略 */
        union
        select '23:45' as "time", "t23:45" as "id", count("t23:45") from tbl where "t23:45" is not null group by "id"
        ) order by "time","id";
    
        /* 取得イメージ */
         time  | id | count
        -------+----+-------
         /* 途中省略 */
         10:30 |  1 |     2
         10:30 |  3 |     1
         10:45 |  1 |     2
         10:45 |  3 |     1
         11:00 |  1 |     1
         11:00 |  3 |     1
         /* 以後省略 */
    
[/code]

＃時間帯情報が列名に変換されていてSELECTの条件に書けないため、`UNION`使って時間帯別に`count(時間帯)`として取得する方法を採っています。個人的には見通しの悪いSQL文と思うので、元のテーブルの構造を見直して、取得しやすくすることをお勧めします。

# 追記

WITH句を使えない場合、「`(先の回答のSELECT文全体)`」を(例えば`tbl`という名前の)VIEWとして定義し`SELECT`で参照する(例えば`select
～ from tbl where "t00:00" is not null`)か、  
`select ～ from tbl`の`tbl`の箇所に直接「`(先の回答のSELECT文全体)`」を記述する方法(例えば`select ～ from
(先の回答のSELECT文全体) t`)をとることになると思います。

[code]

        /* 直接記述するイメージ */
        select '00:00' as "time", "t00:00" as "id",count("t00:00") from (先の回答のSELECT文全体) tbl where "t00:00" is not null group by id
        union
        select '00:15' as "time", "t00:15" as "id",count("t00:15") from (先の回答のSELECT文全体) tbl where "t00:15" is not null group by id
        union
        /* 途中省略 */
        union
        select '23:45' as "time", "t23:45" as "id",count("t23:45") from (先の回答のSELECT文全体) tbl where "t23:45" is not null group by id
        ;
    
[/code]

＃MySQLだと、VIEWではなく`CREATE TEMPORARY
TABLE`で一時テーブルを作成する方法もあるようですが、これだと`UNION`や`JOIN`ができないので、私のアイディアには適用できないようです。


CC BY-SA 3.0
2017-08-24T04:42:58.810
37450
2017-08-29T09:57:26.700
2017-08-29T09:57:26.700
20098
20098
37336
answer