这看起来非常简单,但我还没有把它整合在一起。说我有值
a | b
---+---
1 | 10
1 | 20
2 | 10
2 | 20
我如何从这张表中选择,以便在表格中获取这些值:
a | b
---+---
1 | 10
2 | 20
同样适用于:
a | b
---+---
1 | 10
1 | 20
1 | 30
2 | 10
2 | 20
2 | 30
3 | 10
3 | 20
3 | 30
获取
a | b
---+---
1 | 10
2 | 20
3 | 30
我尝试过不同的on和order by的不同组合,但是这些组合不会起作用,因为它确实需要在a和b上区分。也许一个窗口功能......?如果重要的话,使用postgres。
答案 0 :(得分:1)
我不确定distinct
是否是正确的术语,但如果我理解正确,你有一组a和b的值,以及每个组合的行,你想要匹配第一个a和第一个b,第二个a和第二个b,等等。一种方法是使用窗口函数rank
两列,然后只查询等于行的行:
SELECT a, b
FROM (SELECT a, RANK() OVER (ORDER BY a) AS rank_a,
b, RANK() OVER (ORDER BY b) AS rank_b
FROM myable) t
WHERE rank_a = rank_b
答案 1 :(得分:0)
这是对附录问题的回答,该问题似乎并非真正可归类为评论。使用@ Mureinik的答案作为基础。我确信这是一个更简洁的SQL方法,但首先要快速尝试:
WITH duplicate_a
AS (SELECT a
FROM temp_table_1
GROUP BY a
HAVING Count(1) > 1),
unduplicated
AS (SELECT a,
b
FROM (SELECT a,
Rank() OVER ( ORDER BY a) AS rank_a,
b,
Rank() OVER ( ORDER BY b) AS rank_b
FROM temp_table_1) t
WHERE rank_a = rank_b
AND a IN (SELECT *
FROM duplicate_a)) SELECT *
FROM unduplicated
UNION
SELECT *
FROM temp_table_1
WHERE a NOT IN (SELECT *
FROM duplicate_a);