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, 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我已经尝试了distinct和group by,但我的sql知识充其量也就是一般。
我得到了
PG::GroupingError: ERROR: column "impressions.id" must appear in the GROUP BY clause or be used in an aggregate function有没有人能说点什么?
发布于 2016-09-14 22:18:50
也许这会满足你的需求:
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_id和impressionable_type的所有唯一组合,并在LATERAL子查询中查找具有最大id的行。
发布于 2016-09-14 23:34:03
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 = 1https://stackoverflow.com/questions/39492711
复制相似问题