1

データベース内のいくつかの行をn個のグループにグループ化する必要があります。

例:

select max(data) from tableA group by (groups of 2) order by id;

結果: 20、30、5

それで...

グループ1はID1と2を保持し、グループ2はID 3と4を保持し、グループ3はID5と6を保持します。

tableA
| id  |  data |     
---------------
| 1   | 10    |
| 2   | 20    |
| 3   | 15    |
| 4   | 30    |
| 5   | 5     |
| 6   | 0     |
---------------

SQLを使用してこれを実現する方法はありますか?

注:システムはMySqlで実行されています。

4

2 に答える 2

5
select
    (mod(id, 2) + id)/2 as id_group,
    max(data) as max_data
from tableA
group by 1

sqlfiddleで実行されているこのクエリを参照してください

于 2012-12-02T03:26:26.970 に答える
3

GROUP BY任意の式を保持できるため、値が1に等しい場合はifCASEを返し、それ以外の場合はを使用して返すことができます。これにより、1から増分するペアでそれらがグループ化されます。idMOD 2id - 1

SELECT MAX(data) AS maxdata
FROM tableA
/* GROUP BY the id or (id - 1) depending on the result of its modulo 2 */
GROUP BY CASE WHEN id MOD 2 = 1 THEN id ELSE (id - 1) END

これがSQLfiddle.comのデモです

非順次IDを許可する

アップデート

一晩、私はこのソリューションがのシーケンシャル値に対してのみ正しく機能するという事実についてひどく感じましたid。行を削除すると、正しい結果が得られなくなります。したがって、これは非シーケンシャルなギャップidのあるバージョンを説明するバージョンです。

SET @rowid = 0;
SELECT 
  MAX(data) AS maxdata
FROM (
  SELECT  
    @rowid := @rowid + 1 AS rd,
    data
  FROM tableA
) subq
GROUP BY CASE WHEN rd MOD 2 = 1 THEN rd ELSE (rd - 1) END

そして更新されたSQLfiddle...

于 2012-12-02T03:36:43.230 に答える