SQL:查找第 n 个客户的第 n 个订单

Posted

技术标签:

【中文标题】SQL:查找第 n 个客户的第 n 个订单【英文标题】:SQL: Find nth order for nth customer 【发布时间】: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.***.com/questions/285551 你需要牢牢记住一个概念:没有第 n 行这样的东西,来自任何表以及任何查询。根据定义,表是无序元组(行),仅通过 ORDER BY 子句建立顺序。由于您的窗口函数按 customer_id 分区,但仅按 payment_date 进行排序,因此如果多个客户具有相同的 payment_date,则不能保证每次查询运行时客户都以相同的顺序出现。是的,在同一微秒内很少见,但并不像人们想象的那么罕见。 【参考方案1】:

如果“第四位客户”是指进行第四次租赁的客户,您可以将问题分解为两个 - 找到第四位客户,然后找到他们最昂贵的租金。像这样的:

SELECT * 
FROM payment 
WHERE customer_id = (
    SELECT customer_id 
    FROM payment 
    ORDER BY payment_date 
    LIMIT 1 OFFSET 3
) 
ORDER BY amount DESC
LIMIT 1;

在这里,我在子查询中查找第四个客户的 ID,使用 LIMIT & OFFSET 来获取我想要的一条记录。然后在外部查询中,我只是简单地订购该客户的所有记录并获取最大数量的记录。

【讨论】:

以上是关于SQL:查找第 n 个客户的第 n 个订单的主要内容,如果未能解决你的问题,请参考以下文章

为每个客户选择第一个和第 n 个订单

SQL 窗口函数在订单级别查找每个客户的第二高订单日期

SQL:我如何按顺序列出所有前2个订单的客户ID:第一个订单是帽子,第二个订单是太阳镜? [关闭]

查找Salesperson第二高的销售SQL

sql返回前N行

使用AGGREGATE函数过滤掉$ 0的所有订单