根据 SQLite 中的日期对嵌套组进行排序

order the nested group based on date in SQLite

我的 table 看起来像这样(根据 GrandParentParentChild 分组):

Child | Parent | GrandParent |       Date
---------------------------------------------------
  2   |    1   |    1        | 2015-11-04 01:30:22 
  3   |    1   |    1        | 2015-11-05 01:30:22 
  4   |    4   |    4        | 2015-11-04 01:31:41 
  5   |    5   |    5        | 2015-11-04 01:31:41 
  7   |    7   |    7        | 2014-08-19 03:45:01 
  88  |    8   |    8        | 2014-08-19 03:45:01 
  90  |    8   |    8        | 2014-08-19 03:45:01 
  97  |    8   |    8        | 2015-03-18 03:45:01 
  704 |    8   |    8        | 2015-03-18 03:45:01 
  27  |   11   |    9        | 2015-10-22 06:42:30 
  28  |   11   |    9        | 2015-10-24 06:42:30 
  30  |   12   |    9        | 2015-11-15 06:42:30 
  31  |   12   |    9        | 2015-11-16 06:42:30 

Child 没有 Parent 会认为自己是 ParentGrandParent.

我的目标是订购上述 table 这样:

  1. GrandParent 最近日期的组应该在顶部
  2. GrandParent 中,日期最近的 Parent 组应该在顶部
  3. Parent 内,最近日期的 Child 应该在顶部

结果应该是:

Child | Parent | GrandParent |       Date
---------------------------------------------------
  31  |   12   |    9        | 2015-11-16 06:42:30 
  30  |   12   |    9        | 2015-11-15 06:42:30
  28  |   11   |    9        | 2015-10-24 06:42:30 
  27  |   11   |    9        | 2015-10-22 06:42:30  
  3   |    1   |    1        | 2015-11-05 01:30:22 
  2   |    1   |    1        | 2015-11-04 01:30:22
  4   |    4   |    4        | 2015-11-04 01:31:41 
  5   |    5   |    5        | 2015-11-04 01:31:41 
  97  |    8   |    8        | 2015-03-18 03:45:01 
  704 |    8   |    8        | 2015-03-18 03:45:01 
  88  |    8   |    8        | 2014-08-19 03:45:01 
  90  |    8   |    8        | 2014-08-19 03:45:01 
  7   |    7   |    7        | 2014-08-19 03:45:01 

我想你想要这样的东西:

select t1.* from @t t1
join (select grandparent, max(date) as date from @t group by grandparent) t2 
   on t2.grandparent = t1.grandparent
join (select parent, max(date) as date from @t group by parent) t3 
   on t3.parent = t1.parent
order by t2.date desc, t3.date desc, t1.date desc

您将加入 2 个集合的初始 table,其中第一个集合表示每个 granparent 的最大日期,第二个表示每个 parents.

的最大日期

Fiddle http://sqlfiddle.com/#!7/f304c/4

在 ORDER BY 中使用子查询。

select child, parent, grandparent, date
from mytable
order by
  (select max(date) from mytable grp where grp.grandparent = mytable.grandparent) desc,
  (select max(date) from mytable grp where grp.parent = mytable.parent) desc,
  date desc;