sql - 如何使用 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)
解决方案
我没有 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”订单的情况。在那种情况下你想返回什么?
这是你想要的?
推荐阅读
- python - 擦除 ssh 的输出
- ruby-on-rails - 验证错误显示正在为 :category:Symbol 生成此“未定义方法 `full_message”
- arrays - 拥有由多种卡片组合组成但从不超过一定数量的卡片组的最佳方式是什么?
- java - 从静态函数中退出 Springboot
- javascript - 状态更新未显示渲染内部的更改,即使状态已更新
- c# - HTTP 400:“输入字符串不是有效数字。”
- c# - 以 xamarin 形式测试 BLE(蓝牙低功耗)
- react-native - 如何在 react-native-paper 中更改按钮的波纹颜色
- node.js - 如何使用 AJV 验证包含对象数组的查询对象
- angular - 角度意外错误:无法将 FormControl 绑定到输入