如何根据多列按行排序

时间:2019-08-09 11:48:10

标签: sql sql-order-by

我有此表中要排序的记录列表。 records

其中MAIN_NAME是父亲的名字, STUDENT_NAME是他们的儿子/女儿的名字。如果记录是父亲本身,则为空值; IDENTIFIER,其中1代表数据是父实体,而2是学生。

我已经尝试在MAIN_NAME的CREATED_DATE之前订购它们。但是所有标识符为1的记录将位于所有标识符为2的记录之上。

还曾尝试在CREATED_DATE到达MAIN_NAME。但是MAIN_NAME = ANDREW将比约瑟夫(Joseph)抢先进入,后者比前者更早注册。

我有点困惑,因为日期都是唯一的。

这应该是预期的结果。 expected result

记录应在CREATED_DATE之前订购,但仍应在学生的父亲(MAIN_NAME)记录下标记学生。

2 个答案:

答案 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