PostgreSQL复杂排序
最近我遇到了以下要求,我不确定这里的最佳解决方案是什么 我有一张表,上面有司机的名字,比如说a,B;在另一个表中,我有一些针对这些驾驶员的事件,每个事件都有发布日期,例如,对于驾驶员A,我有2017-06-06和2017-06-09,而对于驾驶员B,我有2017-06-07和2017-06-10(yyyy-mm-dd格式) 我需要这方面的订单,以便在我需要ASC订单的情况下,它比较两个驱动程序的最早发布日期,当它找到驱动程序A的2017-06-06时,它会带来该特定驱动程序的所有事件,然后才是驱动程序B的事件,因此基本上我有以下顺序:PostgreSQL复杂排序,sql,postgresql,Sql,Postgresql,最近我遇到了以下要求,我不确定这里的最佳解决方案是什么 我有一张表,上面有司机的名字,比如说a,B;在另一个表中,我有一些针对这些驾驶员的事件,每个事件都有发布日期,例如,对于驾驶员A,我有2017-06-06和2017-06-09,而对于驾驶员B,我有2017-06-07和2017-06-10(yyyy-mm-dd格式) 我需要这方面的订单,以便在我需要ASC订单的情况下,它比较两个驱动程序的最早发布日期,当它找到驱动程序A的2017-06-06时,它会带来该特定驱动程序的所有事件,然后才是驱
- A-2017-06-06
- A-2017-06-09
- B-2017-06-07
- B-2017-06-10
Id名称
1A
2 B
表2:
发行日期|驾驶员id
2017-06-06|1
2017-06-09 | 1
2017-06-07 | 2
2017-06-10 | 2
如上所述的期望输出,即首先比较发行日期;最早发现时,将具有相同驱动程序id的所有其他事件带到下一个驱动程序事件。您可以使用窗口功能订购第二个表:
select e.*
from events e
order by min(e.event_date) over (partition by e.driver),
e.driver, e.event_date;
这不会加入到第二个表中,但这是对查询的一个小修改。您可以使用窗口函数对第二个表进行排序:
select e.*
from events e
order by min(e.event_date) over (partition by e.driver),
e.driver, e.event_date;
这不会加入第二个表,但这是对查询的一个小修改。编辑您的问题并提供示例数据(两个表)和所需结果。编辑您的问题并提供示例数据(两个表)和所需结果。谢谢!看我想要什么。如果我想要相反的顺序,那就是带上最新发行日期的司机,然后去描述?我尝试使用max(e.event_date)和/或将DESC置于order by,但没有得到所需的输出…@amnine。您可能需要
max()
以及desc
。然而,你在评论中的描述直接与问题相矛盾。这就是我所尝试的:从事件中选择e.*e order by max(e.event_date)over(partition by e.driver),e.driver,e.event_date DESC;期望输出为:B:2017-06-10;B:2017-06-07;A:2017-06-09;A:2017-06-06没关系,我意识到我把DESC放错地方了。这就是对我有效的方法:select e.*从事件e order by max(e.event_date)over(partition by e.driver)DESC,e.driver,e.event_date DESC代码>谢谢!看我想要什么。如果我想要相反的顺序,那就是带上最新发行日期的司机,然后去描述?我尝试使用max(e.event_date)和/或将DESC置于order by,但没有得到所需的输出…@amnine。您可能需要max()
以及desc
。然而,你在评论中的描述直接与问题相矛盾。这就是我所尝试的:从事件中选择e.*e order by max(e.event_date)over(partition by e.driver),e.driver,e.event_date DESC;期望输出为:B:2017-06-10;B:2017-06-07;A:2017-06-09;A:2017-06-06没关系,我意识到我把DESC放错地方了。这就是对我有效的方法:select e.*从事件e order by max(e.event_date)over(partition by e.driver)DESC,e.driver,e.event_date DESC代码>