【问题标题】:Sort by id desc on multiple columns distinct postrges在不同的postgres上按id desc排序
【发布时间】:2016-09-14 14:15:14
【问题描述】:
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

我想从表格中选择所有在 impressable_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

谁能给点启示

【问题讨论】:

  • 你有一些样本数据吗?也许还有一些想要的输出?

标签: sql postgresql greatest-n-per-group distinct-on


【解决方案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_idimpressionable_type 的所有唯一组合,并为每个组合找到LATERAL 子查询中id 最大的行。

【讨论】:

  • 这是响应 ActiveRecord::StatementInvalid: PG::InvalidColumnReference: ERROR: SELECT DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式
  • @user1320651 我更新了答案,你能再试一次吗?
  • 现在似乎只是在测试它,我需要一个独特的 action_name 作为它声明为 action_name = show 吗?
  • 是的,您实际上并不需要它。您可以从DISTINCT ONORDER BY 中删除它。
  • 虽然你有正确的 SQL 可能我没有得到正确的解释,但查询确实有效,但它选择的值不是最近的
【解决方案2】:
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

【讨论】:

  • 不是按展示次数 ID 排序的解决方案,
  • @user1320651 并且您无法添加order by id 子句?
猜你喜欢
  • 2023-04-06
  • 2021-10-07
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2023-03-13
  • 2011-09-28
相关资源
最近更新 更多