【发布时间】:2017-02-28 09:58:40
【问题描述】:
是否可以选择 DISTINCT ON 一些单独的、独立的列集的行?
假设我想要所有符合以下条件的行:
- 区别于
(name, birth) - 区别于
(name, height)
因此,在下表中,标有红叉的行不会是不同的(带有失败子句的指示):
name birth height
--------------------------
William 1976 1.82
James 1981 1.68
Mike 1976 1.68
Tom 1967 1.79
William 1976 1.74 ❌ (name, birth)
William 1981 1.82 ❌ (name, height)
Tom 1978 1.92
Mike 1963 1.68 ❌ (name, height)
Tom 1971 1.86
James 1981 1.77 ❌ (name, birth)
Tom 1971 1.89 ❌ (name, birth)
在上面的示例中,如果 DISTINCT ON 子句刚刚是 DISTINCT ON (name, birth, height),那么所有行都将被视为不同的。
试过了还是不行:
SELECT DISTINCT ON (name, birth) (name, height) ...SELECT DISTINCT ON (name, birth), (name, height) ...SELECT DISTINCT ON ((name, birth), (name, height)) ...SELECT DISTINCT ON (name, birth) AND (name, height) ...SELECT DISTINCT ON (name, birth) AND ON (name, height) ...SELECT DISTINCT ON (name, birth) DISTINCT ON (name, height) ...SELECT DISTINCT ON (name, birth), DISTINCT ON (name, height) ...
【问题讨论】:
-
Postgres 允许在表达式上使用
DISTINCT ON。也许你想要SELECT DISTINCT ON (name||birth, name||height)之类的东西? -
@Eugene 非常好,似乎可以解决问题并且没有明显的性能损失。你为什么不把它变成一个答案?
-
@Jivan 你有订购标准吗?如果没有,您可能会得到随机行,例如您可能会得到
William | 1976 | 1.82或者可能是William | 1981| 1.82 -
@OtoShavadze 精度不错——我猜这个简单的技巧不适用于排序标准
-
您的问题的定义是不确定性。结果可能包括
William 1976 1.82或William 1976 1.74和William 1981 1.82两者都符合您的标准。您需要更仔细地定义目标。 (例如,通过明确定义从每组欺骗中选择哪一行。)并且总是提供您的 Postgres 版本。
标签: sql postgresql duplicates distinct-on