为表数据创建 GUID 而不是密集排名

问题描述 投票:0回答:1

我需要编写 SQL 查询。我用一个虚构的例子来阐述这个要求。

我有一个名为 COURSE_REGISTRATION_DETAILS 的 ORACLE 数据库表,其中包含 3 列 COURSE 、 SUBJECT 、 STUDENT 。每门课程都有多个科目。每门课程可由多名学生选修。双学位也是可以的,即一个学生可以同时修读 2 个工程学。

课程 主题 学生
电子与通信工程 电力电子 汤姆
电子与通信工程 无线电通讯 汤姆
电子与通信工程 嵌入式系统 汤姆
电子与通信工程 电力电子 杰瑞
电子与通信工程 无线电通讯 杰瑞
电子与通信工程 嵌入式系统 杰瑞
计算机科学工程 信息论 大力水手
计算机科学工程 算法 大力水手
计算机科学工程 信息论 汤姆
计算机科学工程 算法 汤姆

我需要为课程和学生的每个不同组合创建一个唯一的 GUID。我尝试了 DENSE_RANK(),但它只给出了一个排名整数。我需要为每个组合创建 GUID。

请帮助我提出一个 SQL 查询来执行相同的操作。

sql oracle uuid guid dense-rank
1个回答
0
投票

您可以为每个分区中的一行设置 GUID,然后找到该分区上的最大 GUID 以设置所有其他行:

SELECT course,
       subject,
       student,
       MAX(guid) OVER (PARTITION BY course, student) AS guid
FROM   (
  SELECT course,
         subject,
         student,
         CASE ROW_NUMBER() OVER (PARTITION BY course, student ORDER BY ROWNUM)
         WHEN 1
         THEN SYS_GUID()
         END AS guid
  FROM   table_name
)

对于样本数据:

CREATE TABLE table_name (Course, Subject, Student) AS
SELECT 'Electronics and communication engineering', 'Power Electronics', 'Tom' FROM DUAL UNION ALL
SELECT 'Electronics and communication engineering', 'Radio Communication', 'Tom' FROM DUAL UNION ALL
SELECT 'Electronics and communication engineering', 'Embedded Systems', 'Tom' FROM DUAL UNION ALL
SELECT 'Electronics and communication engineering', 'Power Electronics', 'Jerry' FROM DUAL UNION ALL
SELECT 'Electronics and communication engineering', 'Radio Communication', 'Jerry' FROM DUAL UNION ALL
SELECT 'Electronics and communication engineering', 'Embedded Systems', 'Jerry' FROM DUAL UNION ALL
SELECT 'Computer Science engineering', 'Information Theory', 'Popeye' FROM DUAL UNION ALL
SELECT 'Computer Science engineering', 'Algorithms', 'Popeye' FROM DUAL UNION ALL
SELECT 'Computer Science engineering', 'Information Theory', 'Tom' FROM DUAL UNION ALL
SELECT 'Computer Science engineering', 'Algorithms', 'Tom' FROM DUAL;

输出:

课程 主题 学生 GUID
计算机科学工程 信息论 大力水手 0x23E8C93E19AD1A8DE063182BA8C02A1E
计算机科学工程 算法 大力水手 0x23E8C93E19AD1A8DE063182BA8C02A1E
计算机科学工程 信息论 汤姆 0x23E8C93E19AE1A8DE063182BA8C02A1E
计算机科学工程 算法 汤姆 0x23E8C93E19AE1A8DE063182BA8C02A1E
电子与通信工程 电力电子 杰瑞 0x23E8C93E19AF1A8DE063182BA8C02A1E
电子与通信工程 无线电通讯 杰瑞 0x23E8C93E19AF1A8DE063182BA8C02A1E
电子与通信工程 嵌入式系统 杰瑞 0x23E8C93E19AF1A8DE063182BA8C02A1E
电子与通信工程 电力电子 汤姆 0x23E8C93E19B01A8DE063182BA8C02A1E
电子与通信工程 无线电通讯 汤姆 0x23E8C93E19B01A8DE063182BA8C02A1E
电子与通信工程 嵌入式系统 汤姆 0x23E8C93E19B01A8DE063182BA8C02A1E

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.