【问题标题】:How can i combine two queries when using distinct使用 distinct 时如何组合两个查询
【发布时间】:2021-08-06 10:05:23
【问题描述】:

我目前在一个项目中,我使用 for 循环创建一个元组列表,其形式为 (id_one, id_two),其中来自以下两个查询的ranking_id 相等。

如果有几行具有相同的ranking_id,则查询从数据库中选择最新更新的行很重要。否则顺序无关紧要。

我想知道是否有一个快速的单查询来代替 for 循环和两个单查询。帮助将不胜感激。干杯!

#查询一个

cur.execute(f''' SELECT DISTINCT ON (ranking_id) ranking_id, id
FROM {my_table}
WHERE user_id = ({user_id_one})
ORDER BY ranking_id ASC, updated_at DESC''')    
list_one = cur.fetchall()

#查询二

cur.execute(f''' SELECT DISTINCT ON (ranking_id) ranking_id, id
FROM {my_table}
WHERE user_id = ({user_id_two})
ORDER BY ranking_id ASC, updated_at DESC''')    
list_two = cur.fetchall()

我正在使用 python 和 postgresql。(我不是在问如何编写 for 循环)

【问题讨论】:

    标签: python sql postgresql


    【解决方案1】:

    测试

    WITH cte AS ( SELECT user_id,
                         ranking_id, 
                         id, 
                         ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY ranking_id ASC, updated_at DESC) rn
                  FROM {my_table} )
    SELECT user_id, ranking_id, id
    FROM cte
    WHERE rn = 1;
    

    【讨论】:

    • 谢谢。但是我不明白这是如何工作的。答案似乎也没有使用 user_id_one 和 user_id_two
    【解决方案2】:

    您可以通过修改 DISTINCT ONORDER BY 子句将查询扩展到两个用户:

    SELECT DISTINCT ON (user_id, ranking_id) ranking_id, id
    FROM {my_table}
    WHERE user_id IN ({user_id_one}, {user_id_one})
    ORDER BY user_id, ranking_id ASC, updated_at DESC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2019-02-16
      • 2020-07-08
      • 2014-07-16
      相关资源
      最近更新 更多