2

Derby データベースを使用しています。

次のようなテーブルがあります。

TB_ORDERS
BUYER_NAME  DATE_CREATED    OTHER_COLLUMS ......
---------------------------------------------
 DAVID       2012-09-01         ----
 PETER       2012-09-14         ----
 DAVID       2012-09-05         ----
 PETER       2012-09-02         ----
 DAVID       2012-08-15         ----
 MARY        2012-09-02         ----
 MARY        2012-09-15         ----

次のように、BUYER_NAME でグループ化された結果を取得しようとしています。各グループは DATE_CREATED で並べ替えられ、最後にすべてがグループの最新の日付で並べ替えられます。

MARY    2012-09-15
MARY    2012-09-12
PETER   2012-09-14
PETER   2012-09-02
DAVID   2012-09-05
DAVID   2012-09-01
DAVID   2012-08-15

ご覧のとおり、Mary's Group には最新の date_created があるため、一番上に配置されています。次に、Peter のグループを 2 位にします (Peter のグループの日付は「09-14」で、Mary のグループの「09-12」よりも 1 つ上の日付であることに注意してください。ただし、Peter のグループは Mary のグループの後に配置されます。グループの最新の日付。

私が知っていることはすべて試しましたが、成功しませんでした。私が得た最も近いものは次のとおりです。

Select date_created, buyer_name 
From ORDERS 
Order By buyer_name,date_created Desc;

ただし、グループは最新のグループ日付順ではありません。

コードでそれを行う必要がありますか、それともより良い方法がありますか?

4

2 に答える 2

1

このクエリは、各 buy_name の最新の date_created と、既に持っている結果セットを返します。この新しい列を Order By 句に含めると、うまくいくはずです。

Select o.date_created, o.buyer_name,
       (select max(date_created) from orders where buyer_name = o.buyer_name) as most_recent_date
From ORDERS o
Order By most_recent_date, o.buyer_name, o.date_created Desc
于 2012-09-18T17:27:17.677 に答える
0

ヘンリケ、このようなエレガントなソリューションをありがとう. 問題を投稿する前に、少なくとも 3 日間試しました。

今、私は新しいものを手に入れました。ページごとに 3 itens のクエリをページ分割しようとすると、最初のページに Petter が表示され、2 ページ目に再び表示されます。この問題を解決するために、バイヤーごとにグループ化されたすべての個別の date_created を選択するサブクエリを使用しています。ここでページネーションを行います。できます。ただし、あなたのようにエレガントで効率的ではありません。これは私の貧弱な解決策です(新しい行「WHERE」を追加しました):

Select o.date_created, o.buyer_name,
    (select max(date_created) from orders where buyer_name = o.buyer_name) as most_recent_date
From ORDERS o  
    where buyer_name in (SELECT buyer_name FROM ORDERS  WHERE date_created in (SELECT  MAX(date_created)  FROM ORDERS GROUP BY buyer_name ORDER BY 1 DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY))
Order By  most_recent_date, o.buyer_name, o.date_created ASC

PS: the resultset shows the oldest date first and for that I am using a
Collections.reverse(list); 

知識は良いですが、想像力はより優れています。

よろしくお願いします、アルマンド

于 2012-09-18T23:08:25.423 に答える