【问题标题】:SELECT 100 last entries with maximum 3 entries per unique user id选择最后 100 个条目,每个唯一用户 ID 最多 3 个条目
【发布时间】:2023-03-23 14:20:01
【问题描述】:

我有以下请求,以获取所有艺术品内部加入他们的用户信息:

SELECT a.*, row_to_json(u.*) as users 
FROM artworks a INNER JOIN users u USING(address) 
WHERE (a.flag != "ILLEGAL" OR a.flag IS NULL) 
ORDER BY a.date DESC 
LIMIT 100

我怎么能有相同的查询,但每个用户不超过 3 个条目?

每个用户都有一个唯一的 ID,称为“地址”

我认为 DISTINCT ON 仅适用于每个用户 1 个,可能是 ROW_NUMBER?

提前谢谢你,我对数据库查询很陌生。

【问题讨论】:

    标签: sql node.js postgresql


    【解决方案1】:

    您需要一个额外的列,在其中指定用户第 n 次出现在表中。这看起来像这样:

    USER  | N
    user1 | 1
    user1 | 2
    user1 | 3
    user2 | 1
    user2 | 2
    

    可以使用以下代码在新表中获取额外的列

        --Create new Table as T
                WITH T AS (
            SELECT TOP 100 
            a.*, 
            row_to_json(u.*) as users,
            ROW_NUMBER() OVER(PARTITION BY u.user ORDER BY a.date DESC) AS N  
            FROM artworks a INNER JOIN users u USING(address) 
            WHERE (a.flag != "ILLEGAL" OR a.flag IS NULL)  )
    
    
    
    --Select columns from your new table       
            SELECT columns from T
            WHERE (T.N =1 OR T.N =2 OR T.N =3) 
             
    
                      
    

    【讨论】:

    • 所以在我的作品表中我需要添加一个额外的列“N”?但是我在里面放什么?它是自动增量吗?我如何将其链接到每个用户?
    • 嗯,好的,谢谢,将尝试计算何时将 ROW_NUMBER() OVER(PARTITION BY a.user) AS N :D
    • 非常感谢,似乎正在工作,我刚刚将 PARTITION BY u.user 更改为 PARTITION BY u.address 并 SELECT columns from T by SELECT * from T,因为列给了我一个错误但是好像没问题。我做了一些测试,让你知道,再次非常感谢:)
    • 祝你好运。请注意 Order by a.date desc 子句。它将给最近的用户一个 N=1 和第二个最近的用户一个 N=2 的分数。如果您使用 ASC 排序,它会给最近最少的用户打 1​​ 分。所以考虑一下您是否要选择最近/最少最近的用户
    • 你能把我的答案标记为解决方案吗? :)
    【解决方案2】:

    只需添加到您的原始查询即可。计算每个用户的结果记录,然后按计数器值过滤。 我使用users.address 作为用户ID。

    SELECT * from 
    (
    SELECT a.*, row_to_json(u.*) as userinfo,
           row_number() over (partition by u.address order by a.date desc) as ucount
     FROM artworks a INNER JOIN users u ON a.address = u.address 
    WHERE a.flag != "ILLEGAL" OR a.flag IS NULL
    ) t
    WHERE ucount <= 3 
    ORDER BY date DESC 
    LIMIT 100;
    

    备注 - 您将 users 作为列别名和表名,这可能会导致混淆。我已将别名更改为userinfo。

    【讨论】:

    • 非常感谢,这个给我一个'ucount'列不存在',知道为什么吗?
    • 因为我犯了一个错误:)。现在编辑。但实际上它与上面的答案几乎相同,但没有 CTE。
    • 谢谢你,将研究这两种方法以了解更多关于这种方法的信息
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2021-01-23
    • 2018-12-28
    相关资源
    最近更新 更多