Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何准确提取每次更改付款方式的最短日期_Sql_Tsql - Fatal编程技术网

Sql 如何准确提取每次更改付款方式的最短日期

Sql 如何准确提取每次更改付款方式的最短日期,sql,tsql,Sql,Tsql,我需要获得每次付款方式在方法id、帐号或路由号码之间更改的最短日期。我在光标和windows函数之间跳跃。执行下面的方法似乎很好,但是当我使用这个方法处理一个较大的数据集时,涉及到不同的pay id,它似乎没有按人的顺序进行操作,因此有些人会有重复的条目 副本将是在使用的同一日期范围内的2笔同类付款。我只想要最小日期 对于windows功能,这是我迄今为止尝试过的。我正在寻找关于如何使更大的数据集更准确的建议。我是走这条路线,还是转而使用一次只接收一个人的存储过程 create table #

我需要获得每次付款方式在方法id、帐号或路由号码之间更改的最短日期。我在光标和windows函数之间跳跃。执行下面的方法似乎很好,但是当我使用这个方法处理一个较大的数据集时,涉及到不同的pay id,它似乎没有按人的顺序进行操作,因此有些人会有重复的条目

副本将是在使用的同一日期范围内的2笔同类付款。我只想要最小日期

对于windows功能,这是我迄今为止尝试过的。我正在寻找关于如何使更大的数据集更准确的建议。我是走这条路线,还是转而使用一次只接收一个人的存储过程


create table #payments (pay_ID uniqueidentifier, pay_type int, pay_account varchar(max), pay_routing varchar(max),  pay_date datetime);
create table #ordered_payments (pay_ID uniqueidentifier,pay_type int, pay_account varchar(max), pay_routing varchar(max), pay_date datetime, rn int);

DECLARE @payID uniqueidentifier = newid();

--Dummy record so that when grabbing the ordered payments we get the first payment. Without this the last result set on line 30 will not pick up the first one.
INSERT INTO #payments (pay_ID, pay_type, pay_account, pay_routing, pay_date) VALUES
(newid(),0, '', '', '1/1/1900')  

--Actual payments made
insert into #payments (pay_ID, pay_type, pay_account, pay_routing, pay_date) VALUES
(@payID, 1, 'e121', '0101', '09/18/2020'),
(@payID, 1, 'e121', '0101', '09/19/2020'),
(@payID, 1, 'e121', '0101', '09/20/2020'),
(@payID, 2, 'e122', '0102', '09/21/2020'),
(@payID, 2, 'e122', '0102', '09/22/2020'),
(@payID, 1, 'e121', '0101', '09/23/2020'),
(@payID, 1, 'e121', '0101', '09/24/2020'),
(@payID, 1, 'e121', '0101', '09/25/2020'),
(@payID, 2, 'e122', '0102', '09/26/2020'),
(@payID, 2, 'e122', '0102', '09/27/2020'),
(@payID, 3, 'e123', '0103', '09/28/2020'),
(@payID, 1, 'e121', '0101', '09/29/2020'),
(@payID, 1, 'e121', '0101', '09/30/2020'),
(@payID, 1, 'e121', '0101', '10/01/2020'),
(@payID, 1, 'e121', '0101', '10/02/2020')



insert into #ordered_payments
select pay_ID, pay_type, pay_account, pay_routing, pay_date, row_number() over(order by pay_date) rn
from #payments

select p.pay_ID ,p.pay_type, p.pay_date, p.rn 
from #ordered_payments p
inner join #ordered_payments pp 
on (
    (
    p.pay_type <> pp.pay_type 
    OR p.pay_account <> pp.pay_account
    OR p.pay_routing <> pp.pay_routing
    ) 
        and p.rn = pp.rn + 1
   )

您可能需要按付款方式进行分区。比如说,

插入到已订购的付款中 选择pay_ID、pay_类型、pay_帐户、pay_路由、pay_日期、按pay_类型超额支付的行数按pay_日期排序 来自付款

或者扩展它以避免重复,例如:

从中选择* 选择pay_ID、pay_类型、pay_帐户、pay_路由、pay_日期、按pay_类型超额支付的行数按pay_日期结果排序 从付款p 其中result=1

我认为您可以使用lag在情况发生变化后获取第一条记录:

select p.*
from (select p.*,
             lag(pay_date) over (partition by pay_id, order by pay_date) as prev_pd,
             lag(pay_date) over (partition by pay_id, pay_account, pay_type, pay_routing order by pay_date) as prev_pd_grp
      from #payments p
     ) p
where prev_pd_grp is null or prev_pd_grp <> prev_pd;

是一个Dfiddle。

如果可能的话,请举例说明。样本数据、期望的结果和逻辑的清晰解释会有所帮助。这并不说明付款从1变为2,再变回1。如果您查看期望的结果,我需要每次付款更改的行。1, 2,1,2,3,1@Going-走了。我已经解决了这个问题。这个很好用,你能把它扩展到处理多个pay_id吗?还是一次处理一个pay_id更好@戈登linoff@Going-走了。我调整了答案。我不确定那个专栏是干什么的。@Going gone。我认为你应该问一个新问题,明确你想要的结果是什么样的。
select p.*
from (select p.*,
             lag(pay_date) over (partition by pay_id, order by pay_date) as prev_pd,
             lag(pay_date) over (partition by pay_id, pay_account, pay_type, pay_routing order by pay_date) as prev_pd_grp
      from #payments p
     ) p
where prev_pd_grp is null or prev_pd_grp <> prev_pd;