SQL 缩小具有滞后和超前查询的结果

SQL narrowing down the results of a query with lag and lead

我正在使用 lag 和 lead 编写一个查询来回顾并获得一个人的前一个 activity、当前 activity 和下一个 activity。不幸的是,如后所述,结果并未正确显示。我需要它来显示当前值,它之前的 new_activity_code(前一个值)以及接下来将出现的 activity 代码(下一个值)。

我只需要它来显示当前 activity 和前面提到的项目。我需要它为多个债务人工作,而不是为同一债务人的多个条目工作。

示例table:

Table invoice_activity:

Invoice_id    debtorId      New_activity_Code           Next_activity_date
  456         00001            123456                           1/2/2015
  741         00002            123456                           2/2/2015
  147         00002            789123                           2/16/2015
  258         00003            987321                           2/24/2015
  369         00004            852369                           2/23/2015
  753         00002            753357                           3/16/2015
  951         00003            428619                           3/24/2015
  428         00004            951628                           3/23/2015
  852         00003            123456                           3/24/2015
  963         00004            123456                           4/11/2015
  654         00001            456789                           5/8/2015

示例输出:

Debtor ID       PreviousValue     CurrentValue      NextValue     Next_act_date
00001               123456           456789           NULL           5/8/2015
00002               123456           789123           753357         3/16/2015
00003               123456           987321           428619         3/24/2015
00004               123456           852369           951628         3/23/2015

我得到的似乎是输出结果,但它对每张新发票都会重复。

查询:

SELECT
    distinct
    debtor_id,
    LAG(ia.new_activity_code) OVER (partition by debtor_id ORDER BY debtor_id) PreviousValue, 
    ia.new_activity_code,
    max(next_activity_date) as next_act_date
FROM
    invoice_activity ia 
WHERE
    debtor_id IN
        (SELECT
             distinct debtor_id
         FROM
             debtor
         WHERE
             client_id=1234)
GROUP BY
    debtor_id,
    new_activity_code
ORDER BY
    next_act_date

不确定您实际期望的结果是什么,它是针对每个债务人的,下一个发生的债务(例如,最小的,但在未来)?我认为这个 returns 那:

select
  debtor_id, 
  previous_value,
  new_activity_code,
  Next_Value,
  next_activity_date
from (
  select
    debtor_id,
    previous_value,
    new_activity_code,
    Next_Value,
    next_activity_date,
    row_number() over (partition by debtor_id 
        order by next_activity_date asc) as rn
  from(
    SELECT
        debtor_id,
        LEAD(ia.new_activity_code) OVER (partition by debtor_id 
            ORDER BY Next_activity_date desc) Previous_Value, 
        LAG(ia.new_activity_code) OVER (partition by debtor_id 
            ORDER BY Next_activity_date desc) Next_Value, 
        ia.new_activity_code,
        Next_activity_date
    FROM
        invoice_activity ia 
  ) t
  where
    next_activity_date > getdate()
 ) t
where rn = 1

一个问题是数据中存在重复记录,或者至少我不确定应该如何处理,因为它是同一债务人和同一日期:

951         00003            428619                           3/24/2015
852         00003            123456                           3/24/2015

至少如果我的分析是正确的,对于债务人 2 这应该是他的正确答案:

753         00002            753357                           3/16/2015

而不是这个(作为以前的值找到):

147         00002            789123                           2/16/2015

而对于 SQL,最里面的 select 获取每一行 + 它的下一个值(按日期降序),然后它外面的那个为行分配一个行号倒序(日期升序)以获得最接近当天的行 + 过滤掉过去的行,最外层的 select 只得到 rn = 1.

的行