我是SQL的新手,我被要求根据Oracle Sql中的另一列创建两个新的值列。
以下是数据的外观:在每个ID下,还有一个IDseq表示此ID中的子段,每个子段都有一个Start和End位置。
SQL需要帮我找到每个ID下最小的IDseq,然后找到相应的起始位置。同样,找到每个ID下最大的IDseq,然后找到相应的结束位置。每个唯一ID只有一个原点和一个目标,它们将显示在两个新列中。我想创建两个新列(见下文) - Origin和Dest来显示每个ID的起源和目的地。
非常感谢您的帮助。
答案 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;