Oracle SQL 按时间间隔分组
Oracle SQL group by time interval
我有一个包含以下列的 table:
order_number
customer_number
creation_date
estimated_ship_date
我需要 select 最大 estimated_ship_date 任何具有相同 customer_number 的记录,并且 creation_date 彼此相隔 15 分钟以内。它可以是任意数量的记录,我会说最多 1-50。
所以基本上按 customer_number 和 creation_date 在 15 分钟内分组。我坚持的是彼此相隔 15 分钟内的 creation_date。
如果您只需要将所有行都落在一个 15 分钟的跨度内的行视为一个组,那么您可以使用 windowing clause:
select order_number, customer_number, creation_date, estimated_ship_date,
max(estimated_ship_date) over (partition by customer_number order by creation_date
range between 15/1440 preceding and 15/1440 following) as estimated_ship_date
from cust_orders;
这会使您的 table 的每一行返回一个额外的列,显示任何行的最长发货日期十五分钟*当前行的任一侧。
如果您有一系列订单,其中每个订单都在前一个订单的 15 分钟以内,但它们并非都在所有其他订单的 15 分钟以内 - 如中的示例所示,它可能无法完全满足您的要求我之前的评论。听起来您可能不希望出现这种情况,或者无论如何也不想将它们组合在一起,但如果确实发生了,您需要查看分组的工作方式,并可能对其进行稍微调整。
* Oracle日期算法是以1表示整日,所以15分钟为(15*60)/(24*60*60)秒;或 900/86400;或 15/(24*60);或 15/1440;或 1/96;等等。您使用哪种表示形式是品味和可维护性的问题。如果您愿意,也可以使用间隔。
我有一个包含以下列的 table:
order_number
customer_number
creation_date
estimated_ship_date
我需要 select 最大 estimated_ship_date 任何具有相同 customer_number 的记录,并且 creation_date 彼此相隔 15 分钟以内。它可以是任意数量的记录,我会说最多 1-50。
所以基本上按 customer_number 和 creation_date 在 15 分钟内分组。我坚持的是彼此相隔 15 分钟内的 creation_date。
如果您只需要将所有行都落在一个 15 分钟的跨度内的行视为一个组,那么您可以使用 windowing clause:
select order_number, customer_number, creation_date, estimated_ship_date,
max(estimated_ship_date) over (partition by customer_number order by creation_date
range between 15/1440 preceding and 15/1440 following) as estimated_ship_date
from cust_orders;
这会使您的 table 的每一行返回一个额外的列,显示任何行的最长发货日期十五分钟*当前行的任一侧。
如果您有一系列订单,其中每个订单都在前一个订单的 15 分钟以内,但它们并非都在所有其他订单的 15 分钟以内 - 如中的示例所示,它可能无法完全满足您的要求我之前的评论。听起来您可能不希望出现这种情况,或者无论如何也不想将它们组合在一起,但如果确实发生了,您需要查看分组的工作方式,并可能对其进行稍微调整。
* Oracle日期算法是以1表示整日,所以15分钟为(15*60)/(24*60*60)秒;或 900/86400;或 15/(24*60);或 15/1440;或 1/96;等等。您使用哪种表示形式是品味和可维护性的问题。如果您愿意,也可以使用间隔。