如何选择仅在某些条件下有所不同的行?

时间:2018-06-08 08:01:04

标签: sql oracle plsql

我能否以某种方式仅选择具有相同id的行,其中值之间的差异不超过10?

CREATE TABLE EXAMPLE_TEST (ID NUMBER, VALUE NUMBER);
INSERT INTO EXAMPLE_TEST(ID, VALUE) VALUES (1, 1);
INSERT INTO EXAMPLE_TEST(ID, VALUE) VALUES (2, 4);
INSERT INTO EXAMPLE_TEST(ID, VALUE) VALUES (1, 9);
INSERT INTO EXAMPLE_TEST(ID, VALUE) VALUES (2, 15);
INSERT INTO EXAMPLE_TEST(ID, VALUE) VALUES (1, 17);

我唯一想到的就是加入同一个表,但这显然是错误的方法,因为你不知道会有多少行。

可能PLSQL是关键吗?但我也无法想出来。

2 个答案:

答案 0 :(得分:3)

您想要选择存在每条记录的近值记录。所以使用EXISTS

select *
from example_test
where exists
(
  select *
  from example_test other
  where other.id = example_test.id
  and other.value <> example_test.value
  and abs(other.value - example_test.value) <= 10
)
order by id, value;

答案 1 :(得分:1)

您可以使用JOIN

SELECT *
FROM Example_test e1
JOIN Example_test e2
  ON e1.ID = e2.id
 AND ABS(e1.value-e2.value) < 10
 AND e1.value ^= e2.value;
 -- to get nice triangular join you need some kind of unique column
 -- (identity/sequence/timestamp)

<强> DBFiddle Demo

编辑:

  

看起来非常令人印象深刻。但为什么我需要一个独特的列? rowid会工作吗?

好点

SELECT *
FROM Example_test e1
JOIN Example_test e2
  ON e1.ID = e2.id
 AND ABS(e1.value-e2.value) < 10
 AND e1.rowid > e2.rowid;

<强> DBFiddle Demo2