sql >> データベース >  >> RDS >> Mysql

MySQLで3つのパックで行を表示する方法

    MySQL 8.0を実行している場合は、次のことを考慮してください。

    SELECT *
    FROM mytable
    ORDER BY 
        FLOOR((ROW_NUMBER() OVER(PARTITION BY type ORDER BY timestamp) - 1)/3),
        type, 
        timestamp
    

    DBフィドルのデモ

    | id  | type | timestamp |
    | --- | ---- | --------- |
    | 1   | A    | 101       |
    | 2   | A    | 102       |
    | 5   | A    | 105       |
    | 3   | B    | 103       |
    | 4   | B    | 104       |
    | 6   | B    | 106       |
    | 7   | A    | 107       |
    | 8   | A    | 108       |
    | 10  | A    | 110       |
    | 9   | B    | 109       |
    | 11  | B    | 111       |
    | 12  | B    | 112       |
    

    以前のバージョンでは、変数を使用してROW_NUMBER()をエミュレートできます。 :

    SELECT id, type, timestamp
    FROM (
        SELECT 
            t.*, 
            @rn := CASE WHEN @type = type THEN @rn + 1 ELSE 1 END rn,
            @type := type
        FROM 
            mytable t
            CROSS JOIN (SELECT @type := NULL, @rn := 1) x
        ORDER BY type, timestamp
    ) x
    ORDER BY 
        FLOOR((rn - 1)/3),
        type, 
        timestamp;
    

    DBフィドルのデモ




    1. Doctrine 2 DQLでDATE()を使用するにはどうすればよいですか?

    2. 列のないSELECTが有効なのはなぜですか

    3. MariaDBでのADDTIME()のしくみ

    4. Rails:rake db:create:allはPostgreSQLデータベースへの接続に失敗します