按订单分组查询问题

时间:2016-10-03 13:08:15

标签: sql postgresql group-by

我有活动表和样本数据,如

enter image description here

我需要通过activity_type_id 3的created_at desc获取不同的contact_id顺序

我试过了

select distinct contact_id 
from activities 
where activity_type_id = 3 order by created_at desc limit 40 offset 0

然后postgres给出错误,如

  

错误:对于SELECT DISTINCT,ORDER BY表达式必须出现在选择列表中       第1行:... om活动,其中activity_type_id = 3 order by created_at ...

我解决了这种错误并尝试了查询,但结果却没有达到预期效果。

按contact_id分组,create_at desc命令没有给出正确的结果。

像上面一样,我试过,分组,排序,不同等等的查询组合。

请建议我。

我想从上面的数据中得到如下的O / P

   id  | contact_id | activity_type_id | created_at
-------+------------+------------------+---------------------
718006 |   45816    |         3        | 2016-10-03 12:29:57
718005 |   45153    |         3        | 2016-10-03 12:27:01
718204 |    3491    |         3        | 2016-10-03 12:25:14
718186 |   42393    |         3        | 2016-10-03 12:23:00
718172 |   26867    |         3        | 2016-10-03 12:21:07
718171 |   45954    |         3        | 2016-10-03 12:20:09

基本上所有唯一的contact_id顺序由created_at desc命令。

谢谢

2 个答案:

答案 0 :(得分:2)

您需要指定您关心的联系人ID - 因为您有多行。

使用select distinct时,select条款中只有order by中的列可用。

因此,请像这样使用group byorder by

select a.contact_id
from activities a
where a.activity_type_id = 3
group by a.contact_id
order by max(a.created_at) desc
limit 40 offset 0;

答案 1 :(得分:2)

这个怎么样?

SELECT contact_id, MAX(created_at) AS CreatedAt 
FROM activities 
WHERE activity_type_id = 3 
GROUP BY contact_id 
ORDER BY CreatedAt DESC
limit 40 offset 0