PostgreSQL如何通过单条查询获取指定名称列表对应的最新批次匹配行
实现方案说明
单条查询实现方法
完全可以用单条SQL实现需求,核心思路是通过子查询先拿到全表最新的批次时间戳,再用该时间戳和名称列表过滤即可,示例SQL如下:
SELECT ts, name, val FROM 你的表名 -- 替换为实际表名 WHERE name IN ('joe', 'eric', 'amelia') AND ts = (SELECT MAX(ts) FROM 你的表名);
拿你提供的示例数据验证:子查询会得到最新时间2020-01-02,外层过滤后会匹配到该时间下名称在列表内的joe和amelia两条数据,和你预期的输出完全一致。
名称列表传入方法
根据使用场景不同,有两种常见的传入方式:
- 手动执行SQL的场景:直接写在
IN子句中即可,多个名称用逗号分隔,字符串类型的名称需要用单引号包裹,和上面示例的写法一致。 - 编程语言调用SQL的场景:不要直接拼接字符串构造SQL(会有SQL注入风险),推荐使用参数化查询传入列表,不同数据库/编程语言的写法略有区别,举两个常见示例:
- Python操作PostgreSQL(使用psycopg2库):
target_names = ['joe', 'eric', 'amelia'] cursor.execute( "SELECT ts, name, val FROM 你的表名 WHERE name = ANY(%s) AND ts = (SELECT MAX(ts) FROM 你的表名)", (target_names,) ) - Python操作MySQL(使用pymysql库):
target_names = ['joe', 'eric', 'amelia'] # 构造对应数量的占位符 placeholders = ', '.join(['%s'] * len(target_names)) sql = f"SELECT ts, name, val FROM 你的表名 WHERE name IN ({placeholders}) AND ts = (SELECT MAX(ts) FROM 你的表名)" cursor.execute(sql, target_names)
- Python操作PostgreSQL(使用psycopg2库):
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

