我需要编写 SQL 查询。我用一个虚构的例子来阐述这个要求。
我有一个名为 COURSE_REGISTRATION_DETAILS 的 ORACLE 数据库表,其中包含 3 列 COURSE 、 SUBJECT 、 STUDENT 。每门课程都有多个科目。每门课程可由多名学生选修。双学位也是可以的,即一个学生可以同时修读 2 个工程学。
课程 | 主题 | 学生 |
---|---|---|
电子与通信工程 | 电力电子 | 汤姆 |
电子与通信工程 | 无线电通讯 | 汤姆 |
电子与通信工程 | 嵌入式系统 | 汤姆 |
电子与通信工程 | 电力电子 | 杰瑞 |
电子与通信工程 | 无线电通讯 | 杰瑞 |
电子与通信工程 | 嵌入式系统 | 杰瑞 |
计算机科学工程 | 信息论 | 大力水手 |
计算机科学工程 | 算法 | 大力水手 |
计算机科学工程 | 信息论 | 汤姆 |
计算机科学工程 | 算法 | 汤姆 |
我需要为课程和学生的每个不同组合创建一个唯一的 GUID。我尝试了 DENSE_RANK(),但它只给出了一个排名整数。我需要为每个组合创建 GUID。
请帮助我提出一个 SQL 查询来执行相同的操作。
您可以为每个分区中的一行设置 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 |