按分组顺序分组

时间:2014-03-09 20:50:39

标签: postgresql group-by sql-order-by grouping

很抱歉这篇文章很长,我是这个&我想确保我完全理解。

我正在尝试通过&小组查询。 我已经从订单开始了:

SELECT "tId", "mId","sId","tr", "tg","tp", "date" 
FROM table 
WHERE "tId" =1 
ORDER BY "date" DESC, "mId","sId";

输出:

 tId |  mId  | sId  | tr  | tg | tp    |          date                                            
-----+-------+------+-----+----+-------+------------------------
   1 |     5 |    2 | -73 |  1 |   122 | 2007-01-01 02:03:01+02
   1 |     5 |    1 | -72 |  1 |   122 | 2007-01-01 02:02:01+02
   1 |     4 |    1 | -70 |  1 |   120 | 2007-01-01 01:01:01+02
   1 |     1 |    1 | -30 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     1 |    2 | -31 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     1 |    3 | -32 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     2 |    1 | -40 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     2 |    2 | -41 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     2 |    3 | -42 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     3 |    1 | -50 |  0 |     0 | 2004-10-19 10:23:54+02
   1 |     3 |    3 | -50 |  0 |     0 | 2004-10-19 10:23:54+02

我想要做的查询是将prev'结果的输出分组并获取:

 mId |    agg_r     | agg_tg  |  agg_tp   | agg_sid |                                   agg_date           
-----+--------------+---------+-----------+----------+------------------------------------------------------------------------------
  5 | {-73,-72}     | {1,1}   | {122,122} | {2,1}    | {"2007-01-01 02:03:01+02","2007-01-01 02:02:01+02"}
  4 | {-70}         | {1}     | {120}     | {1}      | {"2007-01-01 01:01:01+02"}
  1 | {-30,-31,-32} | {0,0,0} | {0,0,0}   | {1,2,3}  | {"2004-10-19 10:23:54+02","2004-10-19 10:23:54+02","2004-10-19 10:23:54+02"}
  2 | {-40,-41,-42} | {0,0,0} | {0,0,0}   | {1,2,3}  | {"2004-10-19 10:23:54+02","2004-10-19 10:23:54+02","2004-10-19 10:23:54+02"}
  3 | {-50,-50}     | {0,0}   | {0,0}     | {1,3}    | {"2004-10-19 10:23:54+02","2004-10-19 10:23:54+02"}

所以我认为这会起作用:

SELECT "mId", array_agg("tr") AS agg_r, array_agg("tg") AS agg_tg, array_agg("tp") AS agg_tp, array_agg("sId") AS agg_sid ,array_agg("date") AS agg_date 
FROM (
   SELECT "tId", "mId","sId","tr", "tg","tp", "date" 
   FROM table 
   WHERE "tId" =1 
   ORDER BY "date" DESC, "mId","sId"
)AS qRes 
GROUP BY qRes."mId";

但我得到了:

 mId |    agg_r     | agg_tg  |  agg_tp   | agg_sid |                                   agg_date           
-----+--------------+---------+-----------+----------+------------------------------------------------------------------------------
  1 | {-30,-31,-32} | {0,0,0} | {0,0,0}   | {1,2,3}  | {"2004-10-19 10:23:54+02","2004-10-19 10:23:54+02","2004-10-19 10:23:54+02"}
  4 | {-70}         | {1}     | {120}     | {1}      | {"2007-01-01 01:01:01+02"}
  2 | {-40,-41,-42} | {0,0,0} | {0,0,0}   | {1,2,3}  | {"2004-10-19 10:23:54+02","2004-10-19 10:23:54+02","2004-10-19 10:23:54+02"}
  3 | {-50,-50}     | {0,0}   | {0,0}     | {1,3}    | {"2004-10-19 10:23:54+02","2004-10-19 10:23:54+02"}
  5 | {-73,-72}     | {1,1}   | {122,122} | {2,1}    | {"2007-01-01 02:03:01+02","2007-01-01 02:02:01+02"}

我错过了什么?为什么分组会改变顺序?

1 个答案:

答案 0 :(得分:2)

就像评论所说,外部查询没有任何顺序。 注意最后一行。

SELECT "mId", array_agg("tr") AS agg_r, array_agg("tg") AS agg_tg, array_agg("tp") AS agg_tp, array_agg("sId") AS agg_sid ,array_agg("date") AS agg_date 
FROM (
   SELECT "tId", "mId","sId","tr", "tg","tp", "date" 
   FROM table 
   WHERE "tId" =1 
   ORDER BY "date" DESC, "mId","sId"
)AS qRes 
GROUP BY qRes."mId"
order by max("date") desc;
相关问题