2016-09-14 16 views
0
SELECT impressions.* 
FROM impressions 
WHERE impressions.user_id = 2 
    AND impressions.action_name = 'show' 
    AND (impressions.message IS NOT NULL) 
GROUP BY impressionable_id, impressionable_type 

我想从表中选择那些在impressionable_id和impresssionable_type订货独特的降ID的所有过去的印象,并获得最后10排序方式上多列ID降序不同postrges

为了解释这种进一步

id, impressionabale_type, impressionable_id, action_name 

50012, assignment, 2, show 
50011, assignment, 1, show 
50010, person, 1, show 
50009, assignment, 1, show 
50008, person, 5, show 
50007, person, 4, show 
50006, person, 3, show 
50005, person, 1, show 
50004, person, 1, show 
50003, person, 2, show 
50002, person, 2, show 
50001, person, 1, show 
50000, person, 1, show 

理想我想这

50012, assignment, 2, show 
50011, assignment, 1, show 
50010, person, 1, show 
50008, person, 5, show 
50007, person, 4, show 
50006, person, 3, show 
50003, person, 2, show 

我已经试过次方ct和group by但是我的sql知识最好是公平的。

我得到

PG::GroupingError: ERROR: column "impressions.id" must appear in the GROUP BY clause or be used in an aggregate function 

有人可以提供一些线索,请

+0

你有一些样本数据吗?也许一些理想的输出呢? – verhie

回答

1

也许Th1将满足您的需求:

SELECT t2.* 
FROM (
    SELECT DISTINCT impressionable_id, impressionabale_type 
    FROM impressions 
    WHERE impressions.action_name = 'show' 
) t1, LATERAL (
    SELECT * 
    FROM impressions 
    WHERE (t1.impressionable_id,t1.impressionabale_type) = (impressionable_id,impressionabale_type) 
    ORDER BY id DESC 
    LIMIT 1 
) t2 
ORDER BY id DESC 
LIMIT 10 

这将找到的impressionable_idimpressionable_type并为每个都是独一无二的组合的子查询会在LATERAL子查询中找到id中最大的那一行。

+0

这是响应ActiveRecord :: StatementInvalid:PG :: InvalidColumnReference:错误:SELECT DISTINCT ON表达式必须匹配初始ORDER BY表达式 – user1320651

+0

@ user1320651我更新了我的答案,可以再试一次吗? – redneb

+0

似乎只是现在测试它,我需要一个不同的action_name作为其声明为action_name = show? – user1320651

0
select * 
from (
    select *, 
     row_number() over (
      partition by impressionable_id, impressionable_type 
      order by id desc 
     ) as rn 
    from impressions 
    where 
     user_id = 2 
     and action_name = 'show' 
     and message is not null 
) s 
where rn = 1 
+0

不完全的解决方案,它没有按印象编号编号, – user1320651

+0

@ user1320651而你无法添加一个'按ID顺序排列的子句? –