首页 > 解决方案 > 如何使用 postgresql 获得每个月的第三个订单

问题描述

我怎样才能得到每个月的第三个订单?

订单详细信息

order_id  || customer_name  || order_Date
--------     ------------      ----------
101             rahul          2019-06-12  
102             naveen         2019-07-24
103             naveen         2019-08-03
104             naveen         2019-09-15 
105             rahul          2019-06-27   
106             rahul          2019-08-21   

这是每个月第三个订单客户下订单的输出。我做了第一个订单。但是,我不能为第三订单。

以下 sql 查询用于查找每个月客户级别的第一个订单。

询问

SELECT billing_address_full_name, email,
  MIN(CASE WHEN month = 'March' THEN 1 ELSE NULL END) March,
  MIN(CASE WHEN month = 'April' THEN 1 ELSE NULL END) April,
  MIN(CASE WHEN month = 'May' THEN 1 ELSE NULL END) May,
  MIN(CASE WHEN month = 'June' THEN 1 ELSE NULL END) June,
  MIN(CASE WHEN month = 'July' THEN 1 ELSE NULL END) July,
  MIN(CASE WHEN month = 'August' THEN 1 ELSE NULL END) August,
  MIN(CASE WHEN month = 'September' THEN 1 ELSE NULL END) September
FROM ord_details
WHERE email NOT IN (
  SELECT email 
  FROM cus_details 
  WHERE customer_groups = 'internal'
) 
GROUP BY billing_address_full_name, email;

结果

          JUNE  JULY  AUGUST SEPTEMBER
rahul      0      0     1        0
Naveen     0      0     0        1       (Just for example)

标签: sqlpostgresqlaggregate-functions

解决方案


我没有 100% 效仿你的例子,但是如果你想为每个客户获得每月的第三个订单,你可以使用窗口函数来做到这一点:

SELECT *
FROM (
  SELECT o.*, 
    ROW_NUMBER() OVER( -- Group by (customer, month)
      PARTITION BY customer_name, EXTRACT(MONTH FROM order_date)
      ORDER BY order_date -- Order rows from oldest to newest
    )
  FROM ord_details o
) src
WHERE RowNum = 3 -- Get third row from each group

这不处理当月没有“3rd”订单的情况。在那种情况下你想返回什么?

这是你想要的?


推荐阅读