4

SQLiteにクエリがあり、特定の列でグループ化し、selectステートメントの別の列で集計関数MAXを使用しています。ここで、MAX集計によって表示される値を保持する行のROWIDも必要です。主キーの制約があるため、これは一意の行である必要があることを私は知っています。クエリの書き方がわかりません。次の例を参照してください。

create table t1 (c1, c2, constraint t1_pk primary key (c1, c2));

insert into t1 values ('boys', 1);
insert into t1 values ('boys', 2);
insert into t1 values ('girls', 1);
insert into t1 values ('girls', 2);

これで、両方の列に主要な制約があるテーブルができました。テーブルのSELECTクエリは、次の出力を提供します。

sqlite> select rowid, * from t1;

rowid|c1|c2
1|boys|1
2|boys|2
3|girls|1
4|girls|2

ここで、c1でグループ化し、c2のMAXを選択します。次に、現在表示されている値を保持する行のROWIDが必要です。次のクエリを参照してください。

sqlite> select rowid, c1, max(c2) from t1 group by c1;

rowid|c1|max(c2)
2|boys|2
4|girls|2

sqlite> select rowid, c1, min(c2) from t1 group by c1;

rowid|c1|min(c2)
2|boys|1
4|girls|1

MIN集計を使用した2番目のクエリは、MIN値を保持している行のROWIDを返す必要があります。これは、私が達成したいことです。

rowid|c1|min(c2)
1|boys|1
3|girls|1

ここで、次の副選択を試しましたが、エラーが発生するため、どちらも機能しません。

sqlite> select (select rowid from t1 b where b.c1 = a.c1 and b.c2 = max(a.c2)), a.c1, max(a.c2) from t1 a group by a.c1;

Error: misuse of aggregate function max()

sqlite> select (select rowid from t1 b where b.c1 = a.c1 and b.c2 = min(a.c2)), a.c1, min(a.c2) from t1 a group by a.c1;

Error: misuse of aggregate function min()

私が最後に試したのは、FROM句のサブクエリですが、これも機能しません。

sqlite> select
   ...>         (select rowid from t1 b where b.c1 = c.c1 and b.c2 = c.c2),
   ...>         c1,
   ...>         c2
   ...> from
   ...>         (select a.c1, max(a.c2) as c2 from t1 a group by a.c1) c;

Error: misuse of aggregate: max()

sqlite> select
   ...>         (select rowid from t1 b where b.c1 = c.c1 and b.c2 = max(c.c2)),
   ...>         c.c1,
   ...>         max(c.c2)
   ...> from
   ...>         (select a.c1, a.c2 from t1 a group by a.c1) c;

Error: misuse of aggregate function max()

私の問題の解決策はありますか?他に何ができるか本当にわかりません。

4

2 に答える 2

3

私があなたの質問を正しく理解した場合は、次のようにしてみてください。

select rowid, c1, min(c2) from t1 a
where c2=(select min(c2) from t1 b where b.c1=a.c1) 
group by rowid,c1;

FIDDLEを確認してください

于 2012-09-12T10:36:35.777 に答える
-1

実際、@ Pradeeshnarayanの回答に続いて、Oracleで機能するように改善する義務があります。「Groupby」句は役に立ちません

select rowid, c1, c2 from t1 a
where c2=(select min(c2) from t1 b where b.c1=a.c1);
于 2020-11-10T13:12:53.670 に答える