首页 > 解决方案 > 基于另一列创建新的值列

问题描述

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

下面是数据的样子:在每个 ID 下,还有一个 IDseq 代表这个 ID 中的一个子段,每个都有一个 Start 和 End 的地方。

点击这里查看表格

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

点击这里查看表格

非常感谢您的帮助。

标签: sqloracle

解决方案


我在看到 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;

推荐阅读