简体   繁体   English

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

[英]Create a new column of value based on another column

I am new to SQL, and am asked to create two new columns of value based on another column in Oracle Sql. 我是SQL的新手,被要求根据Oracle Sql中的另一列创建两个新的值列。

Here is how data looks like:Under each ID, there is also an IDseq representing a sub-segment in this ID, each with a Start and End place. 数据的外观如下:在每个ID下,还有一个IDseq代表该ID中的一个子段,每个子段都有一个开始和结束位置。

点击此处获取表格

SQL needs to help me find the smallest IDseq under each ID, then find the corresponding start place. SQL需要帮助我找到每个ID下最小的IDseq,然后找到相应的开始位置。 Similarly, find the largest IDseq under each ID, then find the corresponding end place. 同样,在每个ID下找到最大的IDseq,然后找到相应的结束位置。 Each unique ID would have only one origin and one destination, which will be shown in the two new columns. 每个唯一的ID只有一个起点和一个目的地,这将在两个新列中显示。 I'd like to create two new columns (see below) - Origin and Dest to show the origin and destination place for each ID. 我想创建两个新列(请参见下文)-“起源”和“目的地”,以显示每个ID的起源和目的地。

单击此处获取表格

Really appreciate your help. 非常感谢您的帮助。

You can use a CASE statement, such as: 您可以使用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

I wrote this before seeing the Oracle tag. 我在看到Oracle标记之前就编写了此代码。 MySQL has derived temp table issues, maybe you can avoid the extras in 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM