Создать новый столбец значения на основе другого столбца - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в SQL, и меня просят создать два новых столбца значений на основе другого столбца в Oracle Sql.

Вот как выглядят данные: под каждым идентификатором также есть IDseq, представляющийподсегмент в этом идентификаторе, каждый с начальной и конечной позицией.

cLICK HERE FOR TABLE

SQL должен помочь мне найти наименьший IDseq под каждым ID, а затем найти соответствующее начальное место.Аналогично, найдите самый большой IDseq под каждым ID, затем найдите соответствующее конечное место.Каждый уникальный идентификатор будет иметь только один источник и один пункт назначения, что будет показано в двух новых столбцах.Я хотел бы создать два новых столбца (см. Ниже) - «Источник» и «Место назначения», чтобы показать место происхождения и место назначения для каждого идентификатора.

CLICK HERE FOR TABLE

Действительно признателен за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я написал это до того, как увидел тег Oracle.В MySQL возникли проблемы с временными таблицами, может быть, вы можете избежать дополнительных функций в Oracle?

CREATE TEMPORARY TABLE tmp_sequence (
IDSeq INT NOT NULL AUTO_INCREMENT, range_id VARCHAR(3), range_start CHAR(1), range_end CHAR(1), origin CHAR(1), destination CHAR(1), PRIMARY KEY (IDSeq)
);

INSERT INTO tmp_sequence (range_id, range_start, range_end)
VALUES ('ABC', 'X', 'Y'), ('ABC', 'Y', 'H'), ('ABC', 'H','L'), ('ABC','L', 'G'),
    ('BCD','Q','D'), ('BCD','D','H'),('BCD','H','Z');

CREATE TEMPORARY TABLE tmp_min AS
SELECT MIN(IDSeq) min_id, range_id
FROM tmp_sequence
GROUP BY range_id;

CREATE TEMPORARY TABLE tmp_start AS
SELECT s.min_id, s.range_id, t.range_start
FROM tmp_sequence t
    JOIN tmp_min s ON t.IDSeq = s.min_id
        AND t.range_id = s.range_id;

UPDATE tmp_sequence t
    JOIN tmp_start s ON t.range_id = s.range_id
SET origin = s.range_start;

CREATE TEMPORARY TABLE tmp_max AS
SELECT MAX(IDSeq) max_id, range_id
FROM tmp_sequence
GROUP BY range_id;

CREATE TEMPORARY TABLE tmp_end AS
SELECT s.max_id, s.range_id, t.range_end
FROM tmp_sequence t
    JOIN tmp_max s ON t.IDSeq = s.max_id
        AND t.range_id = s.range_id;

UPDATE tmp_sequence t
    JOIN tmp_end s ON t.range_id = s.range_id
SET destination = s.range_end;

DROP TEMPORARY TABLE tmp_sequence;
DROP TEMPORARY TABLE tmp_min;
DROP TEMPORARY TABLE tmp_start;
DROP TEMPORARY TABLE tmp_end;
0 голосов
/ 22 мая 2018

Вы можете использовать оператор CASE, например:

select 
    a.idseq, a.id, a.start, a.end,
    case 
        when a.id = 'ABC' then 'X'
        when a.id = 'BCD' then 'Q'
    end as origin,
    case 
        when a.id = 'ABC' then 'G'
        when a.id = 'BCD' then 'Z'
    end as dest
from
yourtablename a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...