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

Sql 从两个字段中选择第一个不同的值,sql,database,postgresql,select,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 |

这看起来非常简单,但我只是没有把它放在一起。说我有价值观

 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

我尝试了不同的distinct on和order by组合,但这些组合不起作用,因为它确实需要在a和b上都是不同的。也许是一个窗口功能。。。?如果有必要,请使用postgres。

我不确定这里的术语是否正确,但如果我理解正确,您有一组a和b的值,以及每个组合的行,您希望将第一个a与第一个b匹配,第二个a与第二个b匹配,等等。一种方法是使用窗口函数对两列进行排序,然后只查询列数相等的行:

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

这是对补遗问题的回答,它似乎并没有真正被归类为评论。使用@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); 

@klin b是b列中的第一个唯一值。因此,如果1 | 10已经存在,2 | 10将无效,必须是2 | 20使用
ctrl-K
或在行的开头添加4个空格,以格式化为
code
是否保证每个
a
精确发生n次?在我的数据集中,我相信是这样的。我的数据集的真正复杂之处在于,此操作只应发生在重复的数据集上。所以如果集合是{1,10},{1,20},{2,10},{2,20},{3999}结果应该是{1,10},{2,20},{3999}。基本上是非笛卡尔积的重复。也许这超出了我所问的范围……如果组中的值数量不相等,这将无法可靠地工作。是的,我很难找到正确的术语,因此无法用谷歌搜索fu,甚至无法准确描述这个问题。只是为了好玩,你怎么称呼这种手术?逆笛卡尔积@vkp任何东西如何处理不相等数量的值?我将继续,是的,这就是我所问的。问题的附录(appendum?meh)只涉及在重复的情况下执行此操作,通过将起点用作子查询并加入一个过于模糊的“where not in”,可以很容易地解决这个问题。谢谢@low_ghost坦白地说,我不知道该怎么称呼这个图案,对不起。@JuanCarlosOropeza我完全支持样式标准化和线绒等,但这看起来像一首前卫的诗。:)顺便说一句,我不理解附录。这看起来很不完善,但是如果对你有用的话,去做吧