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 と impressionable_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

誰か光を当ててくれませんか

4

2 に答える 2

1

多分これはあなたのニーズに合うでしょう:

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これにより、 andのすべての一意の組み合わせが検索され、それぞれについて、サブクエリimpressionable_typeで最大の行が検索されます。idLATERAL

于 2016-09-14T14:18:50.433 に答える
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
于 2016-09-14T15:34:02.883 に答える