AsakusaFW & Tsurugi Advent Calendar 2021の7日目です。
ある値が最大であるレコードを取得するSQLは、以下のように書きます。
select * from テーブル1 t1
where カラム1 = (select MAX(カラム1) from テーブル1 t2 where t2.カラム2 = t1.カラム2)
;
これを単純にAsakusaFW化すると、サブクエリーでひとつのOperatorを作り、さらにそれと結合するCoGroup演算子なりGroupViewなりが必要となります。
が、AsakusaFWではGroupSort演算子ひとつで実現できるので、むしろSQLより簡単です。
@GroupSort
public void getMaxRecord(
@Key(group = {"カラム2"}, order = {"カラム1 desc"} @Once Iterable<テーブル1> inList,
Result<テーブル1> out
) {
for (テーブル1 in : inList) {
out.add(in);
break;
}
}
カラム1を降順に並べて先頭1レコードを取れば、カラム1が最大であるレコードを取得できます。
(カラム1が最大であるレコードが複数ある場合は、カラム1が先頭レコードと同一である間だけ出力するようにすればいいです)