根据另一行中的值选择行值

时间:2016-01-11 00:16:51

标签: sql-server sorting subquery

我有一个具有自动递增标识的表"参考"字段和确定排序顺序的一对其他字段。我需要做的是找到下一个'基于基于初始项的引用字段的字段对进行排序时表中的项。

所以当我按SortParent.SortChild排序时,我的数据看起来像这样:

Reference  SortParent  SortChild  Data
------------------------------------------
9          1           2          Fred
7          1           3          Jim
11         1           4          Sheila
4          2           1          Micro
5          2           2          Archimedes
12         2           3          Electron

所以在这个例子中," Jim"行(参考= 7)来自" Fred" (参考= 9)即使它的参考值较小。

所以我希望能够通过基于Jim的参考搜索找到Fred之后的哪一行

目前在代码中我进行查询以查找Fred的行的值:

SELECT SortParent,SortChild From MyTable WHERE Reference=9

返回1,2。然后搜索1,2:

之后的第一行
SELECT * FROM MyTable 
WHERE ((SortParent=1 and SortChild>2) OR (SortParent>2))
ORDER BY SortParent,SortChild

因此将返回具有引用7和排序值1,3

的行

我非常确定这可以在一个查询中完成,但我最好的方法是难以接受。

顺便提一下,如果有人对处理两部分排序列的替代方法有任何建议,这将使这更容易,请随时提供帮助!

1 个答案:

答案 0 :(得分:0)

我相信您正在查看LEAD或LAG窗口函数:

https://msdn.microsoft.com/en-US/library/hh213125.aspx

SELECT 
    NextReference 
FROM 
    (SELECT
        reference 
        , LEAD(reference, 1,0) OVER (ORDER BY SortParent,SortChild) AS NextReference   
        , *
    FROM 
         mytable 
    ) newTable
    WHERE 
        reference = 9

我使用了LEAD,但如果你正在寻找行的另一个方向

,请尝试使用LAG

我没有对这个特定的查询进行测试,所以我的语法不合理,但如果你有任何麻烦,请告诉我,如果我有一点麻烦,我会再说一遍回到我的办公桌前

编辑:使用您问题中的错误sql作为我的基础

EDIT2:将潜在客户放入子查询中以允许我们查询