Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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_Sybase - Fatal编程技术网

Sql 如果满足特定条件,则同一列的行之间的差异

Sql 如果满足特定条件,则同一列的行之间的差异,sql,sybase,Sql,Sybase,我正在尝试创建一个名为Diff的新列,其中包含名为Rep的同一列中不同行之间的差异,这是一个整数 我的表格如下: ------------------------ security_ID | Date | Rep ------------------------ 2256 |202001| 0 2257 |202002| 1 2258 |202003| 2 2256 |202002| 3 2256 |202003|

我正在尝试创建一个名为
Diff
的新列,其中包含名为
Rep
的同一列中不同行之间的差异,这是一个整数

我的表格如下:

------------------------
security_ID | Date | Rep 
------------------------
2256        |202001|  0
2257        |202002|  1
2258        |202003|  2
2256        |202002|  3
2256        |202003|  5
对于特定的
security\u ID
我想得到
Rep
中的差值,如果
日期是整数,则差值为1(例如202002-202001=1)。例如,我希望输出为:

-------------------------------
security_ID | Date | Rep | Diff
-------------------------------
2256        |202001|  0  |  0
2257        |202002|  1  |  1 
2258        |202003|  2  |  2 
2256        |202002|  3  |  3 
2256        |202003|  5  |  2
最后一行是2的
Diff
,因为
security\u ID
2256的计算将是5-3(分别针对
Date
202003和202002)

编辑:因为Sybase没有
LAG()
我尝试了以下方法:

SELECT security_ID, Date, Rep, 
MIN(Rep) OVER (PARTITION BY Date, security_ID rows between current row and 1 following) - Rep as "Diff"
from
my_table 
但这并没有给我正确的答案。例如,根据上述公式,上面最后一行和倒数第二行的差值
Diff
为0


谢谢

假设
日期
列总是按递增顺序排列,我们可以使用
左连接
和self,并将前面的
rep
值带到外部,然后计算差值。作为

select security_id,dt,rep,(rep-prev_rep) diff
  from
(
select t1.security_id,t1.dt,t1.rep,
       coalesce(t2.rep,0) prev_rep
  from mytable t1
  left join mytable t2
    on t1.security_id = t2.security_id
   and t2.dt = t1.dt - 1
)
order by rep;
编辑:通过OP解决查询尝试

如果可以使用如图所示的窗口功能,则可以按如下所示修改查询:

select security_id
     , dt
     , rep
     , (rep-coalesce(max(rep) over (partition by security_id order by dt rows between unbounded preceding and 1 preceding),0)) diff
from mytable;
order by rep

为什么要将日期存储为整数?@HoneyboyWilson我使用的是现有表,根本不是由meDoes Sybase支持窗口函数创建的?列数据类型是
date
还是字符?对于一个特定的
安全id
,它是否总是按从低到高的顺序递增?@Sujitmohanty30
日期实际上是一个整数(我没有做这个表)。对于特定的
security\u id
它是按从低到高的顺序递增的,谢谢,但是SybaseOops中没有LAG()函数。我知道了。将删除它。:(第一个查询有效。我还没有尝试第二个查询yetGreat!!!希望第二个能够按照预期工作。