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我完全支持样式标准化和线绒等,但这看起来像一首前卫的诗。:)顺便说一句,我不理解附录。这看起来很不完善,但是如果对你有用的话,去做吧