正确查询
既然你正确need the max ref!
的形式是:DISTINCT ON
SELECT DISTINCT ON (code)
id, name, code
FROM old_tab
WHERE (conditions)
ORDER BY code, ref DESC
这通常比具有子查询和窗口函数或聚合函数的解决方案更快、更简单、更短。
如果可以有多个行共享最高的ref
,则添加更多ORDER BY
项目作为 tiebrekaer 来决定返回哪一行。或者 Postgres 会选择一个任意的,因为每个表达式DISTINCT ON
总是返回一行。DISTINCT
在这个密切相关的答案中比较这些样式的解释、链接和基准:
选择每个 GROUP BY 组中的第一行?
另一种快速的方法是:
SELECT id, name, code, ref
FROM old_tab t
WHERE (conditions)
AND NOT EXISTS (
SELECT 1
FROM old_tab t2
WHERE (conditions)
AND t2.code = t.code
AND t2.ref > t.ref
)
小的区别:这个不会打破关系。如果每个code
(和conditions
)多行共享最高ref
,则将返回多行。
CREATE TABLE AS
对于从 a 创建新表SELECT
,推荐的形式是CREATE TABLE AS
。在这里引用手册:
此命令在功能上类似于SELECT INTO
,但它是首选SELECT INTO
,因为它不太可能与语法的其他用途混淆。此外,CREATE TABLE AS
还提供了SELECT INTO
.
大胆强调我的。
所以使用:
CREATE TABLE new_tab AS
SELECT DISTINCT ON (code)
id, name, code
FROM old_tab
WHERE (conditions)
ORDER BY code, ref DESC;