从两个字段中选择第一个不同的值

时间:2016-07-20 16:42:20

标签: sql database postgresql select

这看起来非常简单,但我还没有把它整合在一起。说我有值

 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。

2 个答案:

答案 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);