Postgresql select 不同
Postgresql select distinct
我在 postgresql 上遇到问题 select。
这个查询工作正常:
SELECT
DISTINCT(COLUMN_A || ' - ' || COLUMN_B),
COLUMN_A,
COLUMN_B
FROM
TABLE_A
但是,当我像这样在 select 上包含一个新的列时:
SELECT
DISTINCT(COLUMN_A || ' - ' || COLUMN_B),
COLUMN_A,
COLUMN_B,
COLUMN_C
FROM
TABLE_A
结果的数量增加了,结果集上重复了带有 DISTINCT 的列。
这是怎么回事?
distinct
是 不是 函数。使用 distinct (a), b
与
distinct a, b
或 distinct a, (b)
。您只需将列放在括号之间(开始时这不是一个好主意,因为这会在 Postgres 中创建匿名记录)。
在 Postgres 中你可以使用 distinct on ()
来做你想做的事情(至少我认为那是你想做的):
SELECT distinct on (column_a, column_b)
COLUMN_A || ' - ' || COLUMN_B,
COLUMN_A,
COLUMN_B
FROM TABLE_A
order by column_a, column_b
以上仅适用于 Postgres。如果您正在寻找基于 SQL 标准的便携版本,您可以为此使用 window 函数:
select column_a, column_b, column_c
from (
select column_a, column_b, column_c,
row_number() over (partition by column_a, column_b order by something) as rn
from table_a
) t
where rn = 1;
需要 order by something
来选择重复的行之一。
我在 postgresql 上遇到问题 select。
这个查询工作正常:
SELECT
DISTINCT(COLUMN_A || ' - ' || COLUMN_B),
COLUMN_A,
COLUMN_B
FROM
TABLE_A
但是,当我像这样在 select 上包含一个新的列时:
SELECT
DISTINCT(COLUMN_A || ' - ' || COLUMN_B),
COLUMN_A,
COLUMN_B,
COLUMN_C
FROM
TABLE_A
结果的数量增加了,结果集上重复了带有 DISTINCT 的列。
这是怎么回事?
distinct
是 不是 函数。使用 distinct (a), b
与
distinct a, b
或 distinct a, (b)
。您只需将列放在括号之间(开始时这不是一个好主意,因为这会在 Postgres 中创建匿名记录)。
在 Postgres 中你可以使用 distinct on ()
来做你想做的事情(至少我认为那是你想做的):
SELECT distinct on (column_a, column_b)
COLUMN_A || ' - ' || COLUMN_B,
COLUMN_A,
COLUMN_B
FROM TABLE_A
order by column_a, column_b
以上仅适用于 Postgres。如果您正在寻找基于 SQL 标准的便携版本,您可以为此使用 window 函数:
select column_a, column_b, column_c
from (
select column_a, column_b, column_c,
row_number() over (partition by column_a, column_b order by something) as rn
from table_a
) t
where rn = 1;
需要 order by something
来选择重复的行之一。