SQL Server - 从Select语句中的上一行中获取数据

时间:2014-04-07 14:01:55

标签: sql-server sql-server-2012

我有以下SQL语句:

SELECT  a.Data ,
        a.DataID ,
        b.ParentDataID
FROM    table1 a
        LEFT OUTER JOIN table2 b ON a.DataID = b.ID

例如,结果集的第一行看起来像“a.DataID = 1,a.Data = Cat,b.ParentDataID = 0”;在结果集的下一行中,“a.DataID = 2,a.Data = Dog,b.ParentDataID = 1”。

我想要做的是显示名为“PreviousData”的第4列或b.ParentDataID = 0时它将是空字符串的任何位置,但是如果b.ParentDataID具有等于某些DataID的值(在这种情况下) 1),然后它看起来像:

a.DataID = 2,a.Data = Dog,b.ParentDataID = 1,PreviousData = Cat

如果有可能,我该如何做呢?

3 个答案:

答案 0 :(得分:2)

您正在寻找的是自我加入和CTE(通用表格表达)

With MyView As ( 
        SELECT  
                 a.Data ,
                 a.DataID ,
                 b.ParentDataID 
        FROM    table1 a
        LEFT OUTER JOIN table2 b ON a.DataID = b.ID 
             )

SELECT a.DataID,
       a.Data,
       b.ParentDataId,
       Parent.Data 
From MyView 
       as Parent 
       LEFT Join MyView as Child on Parent.DataId = Child.ParentDataId

注意:由于我没有SQL管理工作室,可能会出现一些语法错误。

答案 1 :(得分:1)

使用LEAD和LAG,这是一个例子:

SELECT
 LAG(p.FirstName) OVER (ORDER BY p.BusinessEntityID) PreviousValue,
 p.FirstName,
 LEAD(p.FirstName) OVER (ORDER BY p.BusinessEntityID) NextValue
FROM Person.Person p

来源: http://blog.sqlauthority.com/2013/09/22/sql-server-how-to-access-the-previous-row-and-next-row-value-in-select-statement/

答案 2 :(得分:0)

使用LAG功能:

select dataid, data , lag(dataid,1,0) over (order by dataid) as parentdataid,
lag(data,1,0) over (over by dataid) as parentdata
from table