【发布时间】:2021-04-09 21:56:54
【问题描述】:
我对 SQL 很陌生,已经学习了大约 3 周,并且很喜欢它。希望在开始申请数据分析师职位之前提高我的技能。
我一直在使用虚拟 dvd 租赁数据库,但发现自己无法解决同行给我的挑战。问题是:“第四位客户最贵的租金是多少?”
我们可以在图片中看到,根据 nth_customer 列,Terrance Roush 是第 4 位客户(他是第 4 位付款的人)。但问题是 nth_customer 列实际上报告了第 n 个订单并继续计数到无穷大。所以下次 Terrance 出现时,nth_customer 列将不会显示“4”(这是我希望实现的)。
如果有任何关于如何解决此问题的反馈,我们将不胜感激。提前谢谢你。
【问题讨论】:
-
请删除该外部图片链接,并将示例数据作为文本直接包含在您的问题中。然后,为 select 子句中的所有内容添加别名。我们无法确定哪一列属于哪个表。
-
如果有 2 个客户都是第 4 位付款人怎么办?
-
这里的问题似乎是你对“nth customer”的定义。您在第 nth_customer 列上的排名报告了所有客户的排名。因此,如果客户连续支付 2 个订单,他将有两个不同的 nth_customer 值。要解决这个问题,您只需要获得这些值中的最低值。因此,您需要创建另一个 CTE,您将在其中 GROUP BY customer_id 并获取 MIN(nth_customer)。这将为您提供“真正的 nth_customer”。
-
请不要将代码或示例数据作为图片发布。请参阅此处了解更多详细信息原因:meta.stackoverflow.com/questions/285551
-
你需要牢牢记住一个概念:没有第 n 行这样的东西,来自任何表以及任何查询。根据定义,表是无序元组(行),仅通过 ORDER BY 子句建立顺序。由于您的窗口函数按 customer_id 分区,但仅按 payment_date 进行排序,因此如果多个客户具有相同的 payment_date,则不能保证每次查询运行时客户都以相同的顺序出现。是的,在同一微秒内很少见,但并不像人们想象的那么罕见。
标签: sql postgresql greatest-n-per-group