как получить 3-й заказ каждого месяца, используя postgresql - PullRequest
1 голос
/ 30 сентября 2019

Как я могу получить 3-й заказ каждого месяца?

order_details

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   

Это вывод для 3-го заказа клиента, делающего заказ в каждом месяце. Я сделал это для 1-го заказа. Но я не мог за 3-й заказ.

Следующий sql-запрос для поиска 1-го заказа на уровне клиента каждого месяца.

Запрос

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)

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Я не на 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

Это не 't обрабатывать случай, когда нет «третьего» порядка месяца. Что вы хотите вернуть в этой ситуации?

Это то, что вы ищете?

0 голосов
/ 01 октября 2019

вот его результат запрос

select
count(case when to_char(a.created_on,'mm')='03' then a.order_id else null end) march,
count(case when to_char(a.created_on,'mm')='04' then a.order_id else null end) april,
count(case when to_char(a.created_on,'mm')='05' then a.order_id else null end) may,
count(case when to_char(a.created_on,'mm')='06' then a.order_id else null end) june,
count(case when to_char(a.created_on,'mm')='07' then a.order_id else null end) july,
count(case when to_char(a.created_on,'mm')='08' then a.order_id else null end) august,
count(case when to_char(a.created_on,'mm')='09' then a.order_id else null end) september
from(
SELECT *
FROM (
  SELECT o.email,o.created_on, o.order_id,
    ROW_NUMBER() OVER( -- Group by (customer, month)
      PARTITION BY email -- Order rows from oldest to newest
      order by created_on
    )
  FROM ord_details o
  where
email NOT IN (
  SELECT email 
  FROM cus_details 
  WHERE customer_groups = 'internal'
)and status!='cancelled'
group by email,created_on,order_id
) src
where row_number=3)a;
...