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,因此它位于顶部。然后我们将彼得的小组排在第二位(请注意,彼得小组的日期“09-14”高于玛丽小组的一个日期“09-12”但是,彼得小组放在玛丽小组之后,因为每件事都应该由组的最近日期。

我已经尝试了我所知道的所有事情,但没有成功。我得到的最接近的是:

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

但是,这些组不按最近的组日期排序。

我应该在我的代码中这样做还是有更好的方法?

4

2 回答 2

1

此查询将为您提供每个买家名称的最新创建日期以及您已经拥有的结果集。如果您在 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 个条目的查询进行分页时,我在第一页和第二页中都得到了 Petter。为了解决这个问题,我使用了一个子查询,在其中我选择了按买家分组的所有不同的 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 回答