我有此表中要排序的记录列表。
其中MAIN_NAME是父亲的名字, STUDENT_NAME是他们的儿子/女儿的名字。如果记录是父亲本身,则为空值; IDENTIFIER,其中1代表数据是父实体,而2是学生。
我已经尝试在MAIN_NAME的CREATED_DATE之前订购它们。但是所有标识符为1的记录将位于所有标识符为2的记录之上。
还曾尝试在CREATED_DATE到达MAIN_NAME。但是MAIN_NAME = ANDREW将比约瑟夫(Joseph)抢先进入,后者比前者更早注册。
我有点困惑,因为日期都是唯一的。
这应该是预期的结果。
记录应在CREATED_DATE之前订购,但仍应在学生的父亲(MAIN_NAME)记录下标记学生。
答案 0 :(得分:0)
您可以在order by
中使用窗口功能。因此,我认为您要创建父级的创建日期,然后是孩子的创建日期,然后是该父级下的创建日期。
您可以使用:
order by min(case when student_name is null then registration_date end) over (partition by main_name),
main_name,
(case when student_name is null then 1 else 2 end),
registration_date
逻辑是:
main_name
排序。答案 1 :(得分:0)
您需要条件排序:
select t.*
from tablename t
order by
case t.identifier
when 1 then t.registration_date
when 2 then (select min(registration_date) from tablename where main_name = t.main_name)
end,
t.main_name,
t.student_name
请参见demo。
结果:
> registration_date | main_name | student_name | identifier
> :------------------ | :-------- | :----------- | ---------:
> 01/01/2019 00:00:00 | JOSEPH | | 1
> 06/08/2019 00:00:00 | JOSEPH | CHOU | 2
> 06/08/2019 00:00:00 | JOSEPH | LOUIS | 2
> 02/01/2019 00:00:00 | ANDREW | | 1
> 03/01/2019 00:00:00 | ANTHONY | | 1
> 01/08/2019 00:00:00 | ANTHONY | CAMILLIA | 2
> 01/08/2019 00:00:00 | ANTHONY | PERCY | 2
> 01/08/2019 00:00:00 | ANTHONY | SEAN | 2
> 01/08/2019 00:00:00 | ANTHONY | TOM | 2