【问题标题】:SQL. Find previous value from previous row(s). lag( )?SQL。从前一行中查找前一个值。滞后()?
【发布时间】:2021-08-28 16:03:24
【问题描述】:

我想要根据联系日期和付款日期查找帐户的上一个付款日期。

select account, PaymentDate, contactdate, trans_amt
  ,lag(PaymentDate,1,'10010101') 
  over(PARTITION BY PaymentDate, account ORDER BY PaymentDate ) 
    as Prev_PaymentDate
from Table1

查询结果:

Row account paymentDate contactdate trans_amt   Prev_PaymentDate
1   123 20210104    20210102    29.7    10010101
2   123 20210104    20210104    29.7    20210104
3   123 20210111    20210102    6.3 10010101
4   123 20210111    20210104    6.3 20210111
5   123 20210205    20210102    33  10010101
6   123 20210205    20210104    33  20210205
7   123 20210205    20210128    33  20210205

在示例中,客户进行了 3 次付款。 1 月 4 日、1 月 11 日和 2 月 5 日。

我想要实现的是 Prev_PaymentDate 是:

Prev_PaymentDate
10010101
10010101
20210104
20210104
20210111
20210111
20210111

第二部分是编写查询以仅显示结果为 3 行的表。 1 月 11 日的付款已被删除,因为之前已联系并在 4 日付款。 2 月 5 日的付款归因于 1 月 28 日的联系人。

感谢您提供的任何帮助。

【问题讨论】:

    标签: sql lag


    【解决方案1】:

    我会稍微备份一下,并询问您的联系人是如何在您的付款方面如此扭曲的。看起来有人已经查询了两张表,并向您展示了联系人和付款的部分笛卡尔积。

    如果我查看您想要的结果,您需要第一条记录的最短联系日期和第二条和第三条记录的最长联系日期。我认为如果你能理清联系人和付款之间的关系规则,整个任务会变得容易得多。

    【讨论】:

      【解决方案2】:

      我相信 partition_by(它的要求,order_by)是您正在寻找的,查看 SQL documentation

      您可以使用 payment_date 或 trans_amt,或者理想情况下使用某种 payment_id 值,您可以将它告诉您的 lag 函数“分组依据”。

      我最近使用的一个红移示例: 引导(action) over (partition by product_id, material_id order by id, product_id, material_id) 作为future_action。

      【讨论】:

        【解决方案3】:

        感谢 Mal 和 Chris 抽出宝贵时间回复。 克里斯关于首先处理数据的好建议。以我有限的 SQL 知识,我将不得不弄清楚如何识别第一次和后续。

        【讨论】:

          猜你喜欢
          • 2016-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-04
          • 1970-01-01
          相关资源
          最近更新 更多