当前位置:  开发笔记 > 数据库 > 正文

有没有办法访问SELECT语句中的"上一行"值?

如何解决《有没有办法访问SELECT语句中的"上一行"值?》经验,为你挑选了5个好方法。

我需要计算表格两行之间的列的差异.有什么方法可以直接在SQL中执行此操作吗?我正在使用Microsoft SQL Server 2008.

我正在寻找这样的东西:

SELECT value - (previous.value) FROM table

想象一下"previous"变量引用了最新选择的行.当然,对于类似的选择,我最终将在具有n行的表中选择n-1行,这不是可能的,实际上正是我需要的.

这有可能吗?



1> Hans Ginzel..:

使用滞后函数:

SELECT value - lag(value) OVER (ORDER BY Id) FROM table

用于Ids的序列可以跳过值,因此Id-1并不总是有效.


@KromStern不仅是PostgreSQL解决方案.[SQL窗口函数](https://www.simple-talk.com/sql/t-sql-programming/window-functions-in-sql/)在[SQL:2003]中引入(https:// en. wikipedia.org/wiki/SQL:2003)标准.

2> RossFabrican..:

SQL没有内置的顺序概念,因此您需要按某些列排序才能使其有意义.像这样的东西:

select t1.value - t2.value from table t1, table t2 
where t1.primaryKey = t2.primaryKey - 1

如果您知道如何订购但不知道如何获得当前的值(EG,您希望按字母顺序排序),那么我不知道在标准SQL中如何做到这一点,但是大多数SQL实现都会有这样做的扩展.

如果您可以对每个行进行排序以使每个行都不同,那么这是一种适用于SQL服务器的方法:

select  rank() OVER (ORDER BY id) as 'Rank', value into temp1 from t

select t1.value - t2.value from temp1 t1, temp1 t2 
where t1.Rank = t2.Rank - 1

drop table temp1

如果需要断开关系,可以根据需要向ORDER BY添加任意数量的列.


假设,主键是按顺序生成的,行永远不会被删除,而select也没有任何其他order子句,而且......
响应“没关系,顺序不是问题” ...那么,为什么不只在查询中减去一个任意值,因为如果您不考虑顺序,这就是您要执行的操作?

3> Jeremy Stein..:
WITH CTE AS (
  SELECT
    rownum = ROW_NUMBER() OVER (ORDER BY columns_to_order_by),
    value
  FROM table
)
SELECT
  curr.value - prev.value
FROM CTE cur
INNER JOIN CTE prev on prev.rownum = cur.rownum - 1



4> Quassnoi..:

Oracle,PostgreSQL,SQL Server和更多RDBMS引擎都具有调用的分析函数,LAG并且LEAD可以执行此操作.

在2012年之前的SQL Server中,您需要执行以下操作:

SELECT  value - (
        SELECT  TOP 1 value
        FROM    mytable m2
        WHERE   m2.col1 < m1.col1 OR (m2.col1 = m1.col1 AND m2.pk < m1.pk)
        ORDER BY 
                col1, pk
        )
FROM mytable m1
ORDER BY
      col1, pk

,COL1您所订购的列在哪里.

索引(COL1, PK)将大大改善此查询.


SQL Server 2012现在也有LAG和LEAD.

5> Joel Coehoor..:

LEFT将表连接到自身,连接条件计算出来,因此在表的连接版本中匹配的行是前一行,对于"previous"的特定定义.

更新:起初我以为你想要保留所有行,对于没有前一行的条件使用NULL.再次阅读它只是想要剔除行,所以你应该是一个内连接而不是一个左连接.


更新:

较新版本的Sql Server也具有可用于此的LAG和LEAD窗口功能.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有