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.
的行
我正在使用 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.
的行