根据另一列创建一个新的值列

时间:2018-05-22 18:26:59

标签: sql oracle

我是SQL的新手,我被要求根据Oracle Sql中的另一列创建两个新的值列。

以下是数据的外观:在每个ID下,还有一个IDseq表示此ID中的子段,每个子段都有一个Start和End位置。

cLICK HERE FOR TABLE

SQL需要帮我找到每个ID下最小的IDseq,然后找到相应的起始位置。同样,找到每个ID下最大的IDseq,然后找到相应的结束位置。每个唯一ID只有一个原点和一个目标,它们将显示在两个新列中。我想创建两个新列(见下文) - Origin和Dest来显示每个ID的起源和目的地。

CLICK HERE FOR TABLE

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

我在看到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;
相关问题