Как выбрать строки, которые отличаются только некоторыми условиями? - PullRequest
0 голосов
/ 08 июня 2018

Можно ли как-то выбрать только строки с одинаковым идентификатором, где разница между значениями не более 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 голосов
/ 08 июня 2018

Вы хотите выбрать каждую запись, для которой существует запись с близким значением.Так что используйте 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;
0 голосов
/ 08 июня 2018

Вы можете использовать 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

РЕДАКТИРОВАТЬ:

Это выглядит довольно впечатляюще.Но зачем мне уникальная колонка?Будет ли работать Ridid?

Хорошая точка

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...