Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL复杂排序_Sql_Postgresql - Fatal编程技术网

PostgreSQL复杂排序

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,B;在另一个表中,我有一些针对这些驾驶员的事件,每个事件都有发布日期,例如,对于驾驶员A,我有2017-06-06和2017-06-09,而对于驾驶员B,我有2017-06-07和2017-06-10(yyyy-mm-dd格式)

我需要这方面的订单,以便在我需要ASC订单的情况下,它比较两个驱动程序的最早发布日期,当它找到驱动程序A的2017-06-06时,它会带来该特定驱动程序的所有事件,然后才是驱动程序B的事件,因此基本上我有以下顺序:

  • A-2017-06-06
  • A-2017-06-09
  • B-2017-06-07
  • B-2017-06-10
我不确定这里的最佳解决方案是什么…也许是另一个选择中的一个选择,具有不同的顺序

表1:
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